演算法問題,找數

2021-07-11 01:43:14 字數 1350 閱讀 8002

問題描述:從乙個正整數m中去掉任意s位後,就會得到乙個新的正整數(保留各位數字的相對位置不變)去掉不同位上的數字就會得到不同的新整數,其中有乙個最小的正整數n,問題是:再利用最小新整數n的各位數字所組成的新整數中,找出大於n的最小整數,若不存在這樣的數,測輸出0.例如,位長位6的正整數175838,去掉任意3位後得到的最小整數為138,由1、3、8三個數字組成的整數包括138、183、318、381、813、831其中大於138的最小整數是183,所以輸出183。

解題思路:第一步是先從高位開始,向低位逐個比較,若當前位的數字大於低一位的數字,則刪除當前位,此時能保證刪除後剩餘各位組成的整數最小。若最後也沒找到

滿足條件的位,則刪除最低位。

第二步:在剩餘數各位的所有排列中尋找當前最小數的下乙個排列數。這裡沒必要去求出所有的排列後再去尋找。從最低位開始,想高位逐位比較,若當前位大於前一位,則需要將當前位之前之後的所有大於前一位數字中的最小值與當前位的前一位交換,然後對從當前位到最低位的各位數字從小到大排序。否則,將當前位移到前一位繼續以上比較,當到達最高位還沒有找到滿足條件的位時,則說明此數為所有排列中的最大數。

/*write by liuqian  2016 04 08 

問題描述:從乙個正整數m中去掉任意s位後,就會得到乙個新的正整數(保留各位數字的相對位置不變)

去掉不同位上的數字就會得到不同的新整數,其中有乙個最小的正整數n,問題是:再利用最小新整數n的

各位數字所組成的新整數中,找出大於n的最小整數,若不存在這樣的數,測輸出0.例如,位長位6的正整數

175838,去掉任意3位後得到的最小整數為138,由1、3、8三個數字組成的整數包括138、183、318、381、813、831

其中大於138的最小整數是183,所以輸出183

*/#include

#include

#include

using namespace std;

/*方法:從最高位開始,向低位逐個比較,若當前位的數字大於低一位的數字,則刪除當前位,此時能保證刪除後剩餘各位組成的整數最小;

否則將當前位移動到低一位繼續以上比較,若到最後也沒找到滿足條件的位,則刪除最低位。

*/void deletemaxnum(string &str, const int len)}/*

查詢下乙個更大的數, 如當前數為1324,下乙個更大的數為1342

方法:從末尾開始往前遍歷,若當前位大於前一位,則需要將當前位之後(即已遍歷過的那些數字)的所有大於前一位數字中的最小值與前一位交換,

然後對當前位到最低位的各位數字從小到大排序

*/void findnextmorelargenum(string &str)

}int main()

return 0;

}

Week12 找數問題

給出n個數,zjm想找出出現至少 n 1 2次的數,現在需要你幫忙找出這個數是多少?輸入 本題包含多組資料 每組資料報含兩行。第一行乙個數字n 1 n 999999 保證n為奇數。第二行為n個用空格隔開的整數。資料以eof結束。輸出 對於每一組資料,你需要輸出你找到的唯一的數。樣例輸出 513 23...

dfs解決迷宮問題(找步數)

dfs為深度優先搜尋,即為順著一條道走到黑,當什麼時候走不動了,才開始往回開始走,它與bfs則不同,bfs是邊走邊看,把每種可能都看一下,但是dfs只要找到一條道路即可。話不多說了,直接看題把 問題描述 小明置身於乙個迷宮,請你幫小明找出從起點到終點的最短路程。小明只能向上下左右四個方向移動。輸入 ...

演算法筆記 問題 B 找x

命題人 外部匯入 時間限制 1.000 sec 記憶體限制 32 mb 題目描述 輸入乙個數n,然後輸入n個數值各不相同,再輸入乙個值x,輸出這個值在這個陣列中的下標 從0開始,若不在陣列中則輸出 1 輸入測試資料有多組,輸入n 1 n 200 接著輸入n個數,然後輸入x。輸出對於每組輸入,請輸出結...