玄魂工做室祕書 [玄魂工做室] python
昨天發的算法有一處狀況沒考慮到,好比加一後有進位,致使又出現重複數字的狀況,修正後今天從新發一次。面試
好比輸入99,那B應該是101 由於100有兩個連續至關的0。算法
基本思路:最壞的辦法 加1一直加1 直到找到有不重複的數爲止。數組
面試:這道題要是做爲面試題的話,要跟面試官確認好,數A的範圍,好比是否有小數是否有負數,等等。在這裏咱們把題肯定爲正數。數據結構
優化思路:優化
若是輸入的數自己不存在重複,則加1;若是存在重複,好比咱們輸入的是11100234,那若是要找比11100234大的最小沒有重複的數,最早重複的兩位數是11,那麼若是想讓11不重複而且比11100234大,那麼應該讓第二位的1加1 變成12100234。而後爲了讓數字最小,則把2後面的數字都變成0,變成12000000;而後在從2後開始找不重複數,00重複,變成01;因此結果是12010101。這裏須要注意:若是變化後又進位的狀況,還須要從新處理一遍,好比199,第一遍處理後變成了200,200仍是有重複,則須要從新處理。code
# -*- coding: utf-8 -*- """ 題目:輸入一個數A,找到大於A的一個最小數B,且B中不存在連續至關的兩個數字。 好比輸入99,那B應該是101 由於100有兩個連續至關的0 基本思路:最壞的辦法 加1一直加1 直到找到有不重複的數爲止 優化的思路 若是輸入是1099 加1後變成1100,那麼他下一個不重複的數若是一直加1效率就會比較低,這是能夠優化的點 這道題要是做爲面試提的話,要跟面試官確認好,數A的範圍,好比是否有小數 是否有負數,等等。在這裏咱們把題肯定爲正數 """ def get_data(num): """ 獲取num個10相乘的數字,爲了讓重複的數字加1,好比num=4 則返回10000 args:須要0的個數 """ data = 1 while num > 0: data = data * 10 num = num -1 return data def get_tail(num, data): """ 獲取data的後面num個數,好比data=1345 num=3 則返回345 args:num須要取後幾位 data數字 """ list_data = [] #獲取到num位0的數字 head = get_data(num) #用抹除的方式獲取後幾位 need_data = data % head return need_data def judge(data): """ 判斷data中是否有連續重複數字 args:data數字 """ i = 1 while i < len(data): #判斷是否有兩個數字相等 if string_num[i-1] == string_num[i]: return True i = i + 1 return False if __name__ == "__main__": #輸入的數字 num = 1099 num = num + 1 #數字轉字符串,爲了判斷是否有相等的數字 string_num = str(num) i = 1 flag = 0 while True: if(judge(string_num)==False): break while i < len(string_num): #判斷是否有兩個數字相等 if string_num[i-1] == string_num[i]: #若是有重複的數字,則把重複的兩個數,中小的一位數字加1,而後在把後面的位置0 new_len = len(string_num) - i - 1 num = num + get_data(new_len) tail = get_tail(new_len, num) #置0的辦法是用num減掉後面的幾位數 num = num - tail string_num = str(num) flag = 1 #置0後 在找後面幾位去找不重複的最小數 i = i + 1 #若是flag=0 證實沒有重複的 證實找到了不重複的數字,則退出 if flag == 0: num = num + 1 string_num = str(num) #若是flag=0 而且運算到了最後一位 if flag == 1 and i >=len(string_num): #在判斷下是否有重複,若是有從新算,沒有則中止 if(judge(string_num)): i = 0 flag = 0 continue else: break print string_num
1099輸出是:1201 ; 99 輸出是:101; 9 輸出是:12 ;1098 輸出是:1201教程
更多算法內容,歡迎關注 訂閱號「白話算法:utf-8