1. 程式人生 > >LintCode 570. 尋找丟失的數 II

LintCode 570. 尋找丟失的數 II

一個 並且 字符 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