在十進位制表示中,任意乙個正整數都可以用字元』0』-『9』表示出來。但是當』0』-『9』這些字元每種字元的數量有限時,可能有些正整數就無法表示出來了。比如你有兩個『1』,乙個『2』,那麼你能表示出11,12,121等等,但是無法表示出10,122,200等數。
現在你手上擁有一些字元,它們都是』0』-『9』的字元。你可以選出其中一些字元然後將它們組合成乙個數字,那麼你所無法組成的最小的正整數是多少?
第一行包含乙個由字元』0』-『9』組成的字串,表示你可以使用的字元。1 ≤字串長度≤ 1000
輸出你所無法組成的最小正整數
測試用例1:輸入:1234567890
輸出:11
測試用例2:
輸入:2233445556677889900111
輸出:222
測試用例3:
輸入:223344555667788990111
輸出:100
本題無法組成的最小數的形式應該只有兩種10...0(n個0)或者x...x(x為1到9)。首先本題要找的是正整數,所以我們先得把0和其他字元分開考慮。
先記錄『1』~『9』這9個字元出現的次數,然後找到出現次數最小的,這裡次數相同時優先找值小的字元,比方說『2』,『3』都出現了2次,而其餘的除『0』外都出現了3次或其以上(0出現2次,下一條解釋為什麼),那麼最小不能組成的數是222,和3無關。
將『1』~『9』**現的最小次數和『0』出現的次數比較,注意比較的時候『0』的出現次數得加1。比方說上一條例子中,『0』出現的次數為1的話,本題答案為100。所以說a[0]=1(0的次數)+1 <= a[2] = 2(2的次數)時,答案的形式為10...0;而a[0]=2 + 1 > a[2] = 2 時,答案形式為x...x。而且通過這個例子我們了解到答案的長度為最小次數加1(『0』為加2),比方說1中的例子答案3個2(2出現2次),2中的例子答案100(0出現1次)
通過2我們總結出的方法:找『1』~『9』出現次數最少且值最小的數,和『0』出現的次數加1進行比較。這裡**實現的時候為了簡化,記錄0出現次數的a[0]初值我直接賦為1,其餘為0,輸入字串後,記錄的0出現的次數比實際出現多了個1,然後排序直接用的stable_sort。num陣列一開始是每個字元的標號,這時num[0]=0,a是對應字元出現的次數。比較函式cmp:兩個數x,y出現次數a[x]之後我們考慮一下特殊情況:
#include#includeusing namespace std;
int num[10]=;
int a[10]=;//出現的次數,『0』的次數初值賦為1,其餘為0
bool cmp(int x,int y)//設定比較函式,將10個字元按出現次數從少到多排列
stable_sort(num,num+10,cmp);//次數相同時,值小的排在前面
查出數字字元字段中非數字字元的記錄
最近,將原來的數字符欄位轉換為數字時,總報錯誤 無效數字。如何找出其中哪些是非數字字元的記錄?比較麻煩的事。下面是用oracle db自帶的函式translate可以找出來的 1.建立測試表 create table testchar item number varchar2 20 2.手工插入測試...
查出數字字元字段中非數字字元的記錄
最近,將原來的數字符欄位轉換為數字時,總報錯誤 無效數字。如何找出其中哪些是非數字字元的記錄?比較麻煩的事。下面是用oracle db自帶的函式translate可以找出來的 1.建立測試表 create table testchar item number varchar2 20 2.手工插入測試...
1132 數字字元統計
time limit 1 sec memory limit 128 mb submit 3906 solved 2078 submit status web board 對於給定的乙個字串,統計其中數字字元出現的次數。字串長度不超過1000.輸入資料有多行,第一行是乙個整數n,表示測試例項的個數,後...