面試題解:輸入一個數A,找到大於A的一個最小數B,且B中不存在連續相等的兩個數字
玄魂工作室祕書 [玄魂工作室]
昨天發的演算法有一處情況沒考慮到,比如加一後有進位,導致又出現重複數字的情況,修正後今天重新發一次。
比如輸入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還是有重複,則需要重新處理。
# -*- 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
更多演算法內容,歡迎關注 訂閱號“白話演算法:
相關文章
- 寫一個函式,輸入一個4位數字,要求輸出這4個數字字元函式字元
- 【演算法】輸入一個已經按升序排過的陣列和數字,在陣列中查詢兩個數字,使得它們的和正好是輸入那個數字。演算法陣列
- 用一個巨集實現求兩個數中的最大數
- 一個拖拉且錯誤的猜數字程式
- 編寫一個統計字串中每個連續字元個數的函式,如 `aaabbcccaabcd` 輸出為`3a2b3c2a1b1c1d`字串字元函式
- 一個猜數字輸贏的小遊戲遊戲
- python之矩陣相加:提示使用者輸入矩陣的行數n,再提示使用者輸入矩陣的列數m,接下來,提示使用者輸入 2*n*m 個數字(每次輸入 一個數字)。輸出 C=A+B。Python矩陣
- [每日一題] 第二十題:最小的k個數每日一題
- java求一個整數的最小因子Java
- 劍指Offer-把陣列中的數排成一個最小的數陣列
- [每日一題] 第十四題:和為s的兩個數字每日一題
- JavaScript判斷兩個變數是否相等JavaScript變數
- js 判斷兩個變數是否相等JS變數
- 找到無序陣列中最小的k個數陣列
- 面試題-JavaScript交換兩個變數的方法面試題JavaScript變數
- 要找出某個檔案中所有包含數字,且數字大於1000的行
- C# 輸入一個整數,求質因數C#
- 每日一題(一):找出兩個陣列中共有的數字每日一題陣列
- 【遞迴打卡1】在兩個長度相等的排序陣列中找到上中位數遞迴排序陣列
- shell指令碼----輸入一個整數,將每個位上的數輸出出來,並求和指令碼
- 演算法訓練 - 調和數列問題 輸入一個實數x,求最小的n使得,1/2+1/3+1/4+...+1/(n+1)>=x。 輸入的實數x保證大於等於0.01,小於等於5.20,並且恰好有兩位小數。你的演算法
- 面試官:來寫個程式碼求一下兩個數的最大公約數吧面試
- 【c語言】求兩個數中不同的位的個數C語言
- js如何判斷一個變數是否是一個數字JS變數
- 深度學習之輸入通道個數、卷積核通道個數,卷積核個數、輸出通道個數的關係深度學習卷積
- [work] python list中數字與一個數相乘Python
- 一個解數獨的程式
- 輸入一個整數陣列,輸出奇偶數相間排列的陣列陣列
- 求一個整數的二進位制中1的個數
- C語言輸入一個數輸出對應的值C語言
- 給定陣列中找到最大的兩個數陣列
- 關於SAP ABAP字元變數和字串變數字元個數的一個知識點,和一個血案字元變數字串
- 求一個陣列中沒有出現的最小正數陣列
- 面試題:一個整數,它加上100後是一個完全...面試題
- 【演算法題解】485. 最大連續1的個數 - Java演算法Java
- 面試演算法題(4)--將一個整數陣列中的所有奇數放到偶數前面面試演算法陣列
- 數商雲B2B商城系統個性化功能詳解
- 統計字串中數字個數,並將數字字串形式輸出字串