LintCode 570. 尋找丟失的數 II
阿新 • • 發佈:2018-04-09
一個 並且 字符 from div string mis cpp lint
給一個由 1 - n
的整數隨機組成的一個字符串序列,其中丟失了一個整數,請找到它。
註意事項
n <= 30
樣例
給出 n = 20
, str = 19201234567891011121314151618
丟失的數是 17
,返回這個數。
思路:回溯法進行深度優先搜索,需要註意的幾點:數字的越界檢查,找到的數字的計數(不計數可能碰到一些特殊情況:比如最終缺失存在兩個數,而其中一個數其實可以分拆成兩個數)不可缺少
class Solution { public: /** * @param n: An integer * @param str: a string with number from 1-n in random order and miss one number * @return: An integer */ int findMissing2(int n, string &str) { // write your code here vector<int> dict(n+1,0); //數組用於標記數字是否出現過,dict[0]用來記錄已經出現了多少個數字 return findTheNum(dict,0,str); } int findTheNum(vector<int>& d,int index,string & str){ int res = -1; if(index == str.size() && d[0] == d.size()-2){ //叠代需要的出口,當index到達str最後的下一個位置並且數字總數達到n-1個時返回剩余的數 for(int i = 1; i < d.size(); ++i){ if(d[i] == 0) res = i; } } if(str[index] == ‘0‘) return res; //指向的下一個數以0開始直接返回 else{ int temp1 = str[index] - ‘0‘; //第一個數字 if(d[temp1] == 0) { d[temp1] = 1; //深度優先搜索,找合適的結果 d[0]++; //計數+1 int ret = findTheNum(d,index+1,str); if(ret != -1) res = ret; //如果能找到更改res值 d[temp1] = 0;//回溯的套路,恢復原狀 d[0]--; } if(index+1<str.size()){ int temp2 = str[index+1] - ‘0‘; temp2 = temp2 + temp1*10; //如果兩個數組成 if(temp2 < d.size() && d[temp2] == 0){ d[temp2] = 1; d[0]++; int ret = findTheNum(d,index+2,str); if(ret != -1) res = ret; d[temp2] = 0; d[0]--; } } } return res; //最後返回結果 } };
其實只要熟悉了回溯的套路,這種題只要認真審題做出來就是時間問題了
LintCode 570. 尋找丟失的數 II