給定乙個整數 n ,你需要找到與它最近的回文數(不包括自身)。
「最近的」定義為兩個整數差的絕對值最小。
示例 1:
輸入: "123"
輸出: "121"
注意:
n 是由字串表示的正整數,其長度不超過18。
如果有多個結果,返回最小的那個。
思路分析:
如果陣列的字串長度 == 1,數字n - 1
開頭為1,9**9為乙個候選答案 例:100000,答案為99999
開頭為9, 10**01為乙個候選答案 例:99999,答案為100001
如果本身對稱,則把最中間的乙個(或兩個)位數減(如果0則加)一
例:123321,答案為122221
例:120021,答案為121121
如果不對稱:
把前半部分逆序替換掉後半部分 例:1223,答案為1221
把最中間的乙個(或兩個)位數加一 例:1283,答案為1331,而非1221
把最中間的乙個(或兩個)位數減一 例:1800,答案為1771,而非1881
class
solution
if(n[0]
=='1'
)else
if(n[0]
=='9')if
(ispalindromic
(n))
else
}else
else
} candidate.
push_back
(temp);}
else
temp += revtemp;
candidate.
push_back
(temp)
;//"955166082267348992"轉換成"955166082280661559"
//把最中間的乙個(或兩個)位數加
一、減一
if(strsize %2)
if(temp[strsize /2]
!='9')}
else
if(temp[strsize /2]
!='9')}
}//按照數值大小進行公升序排序
sort
(candidate.
begin()
, candidate.
end(
), mycmp)
;//獲取差的絕對值最小的結果
long
long diff = llong_max, longn =
stoll
(n);
string res ="";
for(auto& tempres : candidate)
}return res;
}//自定義按照字串數值大小排序
static bool mycmp
(string & strone, string & strtwo)
else
}//判斷是否是回文對稱
bool ispalindromic
(string & num)
}return
true;}
};
我們將字串型修改為long long型進行加、減操作就快捷很多,並且將vector容器修改為set容器,這樣就需要額外進行排序。
class
solution
//候選結果集中可能含有自身,需要剔除
candidateset.
erase
(n);
//最後在結果集(set公升序排列)中查詢出最近的回文數
修改為long long型別操作**簡潔了很多。
Leetcode 564 尋找最近的回文數
分析 是一道數學題。距離最近的回文子串,總計三種可能情況。一是左半邊拷貝到右半邊,二是中間為0,則一半減一,再拷貝,三是中間為9,則一半加一,再拷貝。還有一些特殊情況。針對三位數,最近回文串範圍一定在 99,1001 之間,則再加上兩種情況。總共五種,減去與自身重複的選項。放進set。找到diff最...
經典演算法題 尋找最近的回文數
給定乙個整數 n 你需要找到與它最近的回文數 不包括自身 最近的 定義為兩個整數差的絕對值最小。示例 1 輸入 123 輸出 121 如果陣列的字串長度 1,數字n 1 開頭為1,9 9為乙個候選答案 例 100000,答案為99999 開頭為9,10 01為乙個候選答案 例 99999,答案為10...
尋找最近點對
一維的數很簡單,先排序,再掃瞄已排好的數,相鄰兩個進行比較即可,時間複雜度為o n log2n n o n log2n 兩維的話 把平面上n個點分成兩部分left和right。假設分別求出left和right兩部分最短距離mindistleft和mindistright,還有一種情況就是點對中乙個點...