寻找丢失的数 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; i<flag.size(); ++i) 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 };