String 查找给定字符串中缺少的数字

String 查找给定字符串中缺少的数字,string,algorithm,String,Algorithm,我发现这个面试问题到处都是,经过深思熟虑之后,我真的无法为它开发出一个合理的算法 给定一个按顺序排列的数字串,查找缺少的数字。数字的范围未给定 示例输入:“9899100101103104105” 答复:102 当然,唯一的困难是计算出数字的位数。我看到两种方法 尝试为第一个数字输入一定数量的数字,然后决定下面的数字应该是什么(根据缺少的数字是否是第二个数字,将有两个选项),然后查看是否与下面的数字字符串匹配。如果是,请继续。如果字符串不符合模式,请使用其他位数重试 查看字符串的起始部分和结束部

我发现这个面试问题到处都是,经过深思熟虑之后,我真的无法为它开发出一个合理的算法

给定一个按顺序排列的数字串,查找缺少的数字。数字的范围未给定

示例输入:“9899100101103104105”

答复:102


当然,唯一的困难是计算出数字的位数。我看到两种方法

  • 尝试为第一个数字输入一定数量的数字,然后决定下面的数字应该是什么(根据缺少的数字是否是第二个数字,将有两个选项),然后查看是否与下面的数字字符串匹配。如果是,请继续。如果字符串不符合模式,请使用其他位数重试
  • 查看字符串的起始部分和结束部分,并根据该部分和字符串的长度推断位数。这一个比较手工
  • digits=1
  • 像第一个数字一样解析字符串,只包含
    digits
    digits
  • 解析下一个数字,并检查它是否与上一个解析的数字相关
  • 如果它减少,
    数字+=1
    ,则转到1
  • 如果它比上一次解析的值高2,您可能会找到间隙,解析其余的,如果解析rest不是递增序列,
    digit+=1
    ,转到2,否则您已经找到间隙
  • 如果它比上次解析的数字高1,则转到3
  • 数字+=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(索引

    这可能会大大简化,但在探索性编码过程中,我喜欢写出清晰易懂的代码,而不是试图用尽可能少的代码行或尽可能快的速度来编写。

    这是一个简单的问题

  • 猜测第一个数字的位数
  • 从字符串中逐个读取数字。如果之前读取的数字是x,则下一个数字必须是x+1或x+2。如果是x+2,请记住x+1是未命中的数字,继续直到字符串结束,以验证初始猜测是否正确。如果您阅读的不是x+1或x+2,则初始猜测是错误的,您需要重新开始(下一次)猜测
  • 以你的例子:

    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