LeetCode 尋找最近的回文數

2021-09-18 02:34:28 字數 2187 閱讀 3032

給定乙個整數 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,還有一種情況就是點對中乙個點...