java如何从没有空格的一串数字中找到丢失的数字?
Input Format
The first line will contain the set of numbers in the sequence. Number are listed in ascending order.
Boundary Conditions
1<=M<=99999 Length of string S is from 5 to 200.
Output Format
The first line will contain the missing number M.
Example Input /Output 1
Input: 12346789
Output: 5
Input /Output 2 Input 596597598600601602
Output : 599
The numbers a sequence in the sequence are 596 597 598 599 600 601 602. 599 is the missing numbers
我的Java解决方案是:
我使用了split(("?<=\\G..."))
等,将数字分成一、二、三、四和五位数。并将数字保存到相应的数组中。然后我检查了数组中两个相邻数字之间的差异——如果是一个,那么它将调用一个函数来查找缺少的数字
但问题是,当:
输入:
999899991000110002
输出:
10000
序列号是9998999100011002。丢失的数字是10000
当可以从4位数字转换为5位数字时,如何分割字符串?有没有更好的办法解决这个问题
public void test(Scanner in)
{
String n = in.nextLine();
int n1 = n.length();
System.out.println(n1);
if (n1 % 2 == 0)
{
} else {
n = "0" + n;
}
System.out.println(n);
String[] one = n.split("(?<=\\G.)");
String[] two = n.split("(?<=\\G..)");
String[] three = n.split("(?<=\\G...)");
String[] four = n.split("(?<=\\G....)");
String[] five = n.split("(?<=\\G.....)");
int x = one.length;
int y = two.length;
int z = three.length;
int u = four.length;
int v = five.length;
int[] aa1 = new int [x];
int[] aa2 = new int [y];
int[] aa3 = new int [z];
int[] aa4 = new int [u];
int[] aa5 = new int [v];
for (int i = 0; i < x; i++)
{
aa1[i] = Integer.parseInt(one[i]);
}
if (aa1[1] == aa1[3] - 2)
{
findmissing(aa1, x);
}
for (int i = 0; i < y; i++)
{
aa2[i] = Integer.parseInt(two[i]);
}
if (aa2[1] == aa2[3] - 2)
{
findmissing(aa2, y);
}
for (int i = 0; i < z; i++)
{
aa3[i] = Integer.parseInt(three[i]);
}
if (aa3[1] == aa3[3] - 2)
{
findmissing(aa3, z);
}
for (int i = 0; i < u; i++)
{
aa4[i] = Integer.parseInt(four[i]);
}
if (aa4[1] == aa4[3] - 2)
{
findmissing(aa4, u);
}
for (int i = 0; i < v; i++)
{
aa5[i] = Integer.parseInt(five[i]);
}
if (aa5[1] == aa5[3] - 2)
{
findmissing(aa5, v);
}
in.close();
}
public static void findmissing(int[] bb, int value)
{
for (int i = 0; i < value - 1; i++)
{
if (bb[i] == bb[i + 1] - 1)
{
} else {
System.out.println(bb[i + 1] - 1);
}
}
}
# 1 楼答案
如果你已经知道第一个数字,这应该是可行的。不过,确定第一个数字可能很棘手
# 2 楼答案
除了解决OP给出的问题外,您还必须解决另外两个问题
无论如何,下面是我针对代码运行的测试用例。第一行是数字字符串。第二行是字符串中的数字数组。第三行是丢失的号码
这段代码的要点是尝试你能想到的所有边缘情况。除非我写了代码,否则我不会想到989900序列
# 3 楼答案
这是一个递归的、可运行的解决方案
# 4 楼答案
如果(我假设)数字是按顺序列出的,那么一个非常简单的算法将起作用:
try(toInt(S[1 .. d]), S[d+1 .. |S|])
尝试以S[1..d]编码的数字开始的数字序列。如果此序列“起作用”,则将其输出并停止李>上面的主循环在d=5处停止,因为您给出了M<;=99999,但它可以很容易地与任意大的数字一起工作,只需让d一直增加到| S |
第二步(“尝试…”)这很容易,因为您已经拥有此(候选)序列中的第一个数字x,因此您可以轻松生成对应于下一个应出现的数字(即对应于x+1)的数字字符串,并将其与S的其余部分进行比较。如果对应于x+1的数字字符串与S的前几个字符不匹配,然后尝试对应于x+2的数字字符串。如果匹配,则设置一个标记,记录x+1可能是丢失的数字,然后继续。如果x+1和x+2都不匹配,或者如果x+1不匹配且标志已设置,我们知道初始值不可能正确,因此返回并让主循环尝试下一个较长的初始值:
显然,您可以将“先删除…S个字符”步骤替换为只在(不变)字符串中使用偏移量,但我觉得上面的解释更容易
# 5 楼答案
您将始终以last first==序列结束。大小()//即7-3=4
这样,就很容易检测到正确的编号长度(至少要显著减少要检查的列表编号)
为了提高性能,您可以检查字符串(如果有)。长度可被数字长度整除,否则陷阱将是:
1230124如果只选择前3个和最后3个字符,则测试数字长度3
我首先写了一个Scala解决方案,一行代码,承认了一条很长的线:
或可读性更好:
s是要分析的字符串。集合函数集更加丰富,从数组到列表或向量的转换不那么麻烦,因为一个方便的函数只在这里定义,另一个函数只在那里定义。在幕后流畅地将int转换为整数
# 6 楼答案
我认为您可以改进此代码,但请尝试: