String 查找给定字符串中缺少的数字
我发现这个面试问题到处都是,经过深思熟虑之后,我真的无法为它开发出一个合理的算法 给定一个按顺序排列的数字串,查找缺少的数字。数字的范围未给定 示例输入:“9899100101103104105” 答复:102String 查找给定字符串中缺少的数字,string,algorithm,String,Algorithm,我发现这个面试问题到处都是,经过深思熟虑之后,我真的无法为它开发出一个合理的算法 给定一个按顺序排列的数字串,查找缺少的数字。数字的范围未给定 示例输入:“9899100101103104105” 答复:102 当然,唯一的困难是计算出数字的位数。我看到两种方法 尝试为第一个数字输入一定数量的数字,然后决定下面的数字应该是什么(根据缺少的数字是否是第二个数字,将有两个选项),然后查看是否与下面的数字字符串匹配。如果是,请继续。如果字符串不符合模式,请使用其他位数重试 查看字符串的起始部分和结束部
当然,唯一的困难是计算出数字的位数。我看到两种方法
digits=1
digits
digits李>
数字+=1
,则转到1李>
digit+=1
,转到2,否则您已经找到间隙李>
数字+=1
,转到2。(我不确定这种情况是否会发生)给出:“131416”。
1.数字=1
2.解析“1” 3.解析“3”
4.它不会减少
5.可能找到了差距:解析其余的'1416'失败,因为'1'!='4'
=>数字+=1(数字=2)转到2
2.解析“13”
3.解析“14”
4.它不会减少
5.它不比上一次解析的(13)高出2个
6.它高出1(14=13+1)=>转到3
3.解析“16”
4.它不会减少
5.可能找到了间隙:解析传递的其余“”是因为没有更多要解析的内容,
=>找到了gab:“15”是缺失的数字这是一个有效的C#解决方案,您可以签入:
void Main()
{
FindAdministringNumberString(“9899100101103104105”).Dump(“应为102”);
FindAdministringNumberString(“78910121314”)。转储(“应为11”);
FindAdministringNumberString(“99899910011002”).Dump(“应为1000”);
//将抛出InvalidOperationException,我们缺少1000和1002
FindAdministringNumberString(“99899910011003”);
}
公共静态int-findAdminingNumberString(字符串s)
{
用于(整数位数=1;位数<4;位数++)
{
int[]numbers=GetNumbersFromString(s,位);
int结果;
if(FindMissingNumber(数字,输出结果))
返回结果;
}
抛出新的InvalidOperationException(“无法确定“'+s+“'的缺失数字”);
}
公共静态int[]GetNumbersFromString(字符串s,整数位数)
{
var result=新列表();
int索引=数字;
int number=int.Parse(s.Substring(0,数字));
结果。添加(编号);
while(索引
这可能会大大简化,但在探索性编码过程中,我喜欢写出清晰易懂的代码,而不是试图用尽可能少的代码行或尽可能快的速度来编写。这是一个简单的问题
9899100101103104105
第一猜测长度1
read 9
the next number should be either 10 or 11. Read the next two digits, you get 89.
That is incorrect, so the initial guess was wrong.
第二猜测长度2
read 98
the next number should be either 99 or 100. Read the next two digits for 99
the next number should be either 100 or 101. Read the next three digits for 100
... 101
... 103 (remember 102 as the missed number)
... 104
... 105
end of input
长度2的猜测被证实是正确的猜测,102被报告为缺失的数字。我想在这些行的某个地方。但是不要认为这是正确的。输入:“131416”。您的算法将输出2,而15应该是答案。我想我们需要再做一些检查,即当位数增加(从99增加到100)时会发生什么。我们正在考虑一个非常简单的解决方案,这可能会起作用,但我认为一定有一个更聪明的解决办法。@Ankesh Anand:数字数量增加的情况很简单。我打赌这对任何人来说都不是挑战。可能有一个“更聪明”的解决方案(不管你怎么定义,但这解决了问题(这就是问题所在)。这是一个相当重要的问题
read 98
the next number should be either 99 or 100. Read the next two digits for 99
the next number should be either 100 or 101. Read the next three digits for 100
... 101
... 103 (remember 102 as the missed number)
... 104
... 105
end of input