LintCode:寻找丢失的数 II

 

寻找丢失的数 II 

给一个由 1 - n 的整数随机组成的一个字符串序列,其中丢失了一个整数,请找到它。

 注意事项

n <= 30

样例

给出 n = 20, str = 19201234567891011121314151618

丢失的数是 17 ,返回这个数。

思路:回溯法

 1 class Solution {
 2 public:
 3     /**
 4      * @param n: An integer
 5      * @param str: a string with number from 1-n in random order and miss one number
 6      * @return: An integer
 7      */
 8     int getNum(vector<bool> &flag)
 9     {
10         for(int i=1; ii)
11         {
12             if(flag[i]==false)return i;
13         }
14         return -1;
15     }
16     void Backtrace(int n, string &str, int i, int count, vector<bool> &flag, int &result)
17     {
18         if(result!=-1)return;//如果result已经有值,说明其他分支已经计算出来了,此分支直接返回
19         if(i>str.size() || count>=n)return;
20         if(i==str.size()){
21             if(n-1==count){
22                 result=getNum(flag);
23             }
24             return;
25         }
26         if(str[i]=='0')return;//不能从0开始取数
27         for(int j=1; j<=2; ++j)//由于n<=30,故最多取两个字符组成一个数字
28         {
29             int num=atoi(str.substr(i, j).c_str());
30             if(num<=0 || num>n || flag[num]==true)continue;
31             flag[num]=true;
32             Backtrace(n, str, i+j, count+1, flag, result);
33             flag[num]=false;
34         }
35     }
36     int findMissing2(int n, string &str) {
37         if(n<=0 || str.size()==0)return -1;
38         vector<bool> flag(n+1, false);
39         int count=0;
40         int result=-1;
41         Backtrace(n, str, 0, count, flag, result);
42         return result;
43     }
44 };

 

 

转载于:https://www.cnblogs.com/jeysin/p/8654149.html

你可能感兴趣的:(面试)