在不带分隔符的数字字符串中查找缺失的数字
给定一个由一些数字组成的字符串,不被任何分隔符分隔。这些数字是正整数,除了缺少的数字之外,每个数字的序列都会增加一。任务是找到丢失的号码。这些数字将不超过六位数。如果输入序列无效,则打印 -1。
例子:
Input : 89101113
Output : 12
Input : 9899101102
Output : 100
Input : 596597598600601602:
Output : 599
Input : 909192939495969798100101
Output : 99
Input : 11111211311411511
Output : -1
这个想法是尝试从 1 到 6 的所有长度。对于我们尝试的每个长度,我们检查当前长度是否满足所有连续数字和一个缺失的属性。有趣的是,当我们增加数字时,数字的数量可能会发生变化。例如,当我们从 99 移动到 100 时。为了处理这种情况,我们使用以 10 为底的对数来查找位数。
下面是上述方法的实现:
C++
// C++ program to find a missing number in a
// string of consecutive numbers without any
// separator.
#include
using namespace std;
const int MAX_DIGITS = 6;
// gets the integer at position i with length m,
// returns it or -1, if none
int getValue(const string& str, int i, int m)
{
if (i + m > str.length())
return -1;
// Find value at index i and length m.
int value = 0;
for (int j = 0; j < m; j++)
{
int c = str[i + j] - '0';
if (c < 0 || c > 9)
return -1;
value = value * 10 + c;
}
return value;
}
// Returns value of missing number
int findMissingNumber(const string& str)
{
// Try all lengths for first number
for (int m=1; m<=MAX_DIGITS; ++m)
{
// Get value of first number with current
// length/
int n = getValue(str, 0, m);
if (n == -1)
break;
// To store missing number of current length
int missingNo = -1;
// To indicate whether the sequence failed
// anywhere for current length.
bool fail = false;
// Find subsequent numbers with previous number as n
for (int i=m; i!=str.length(); i += 1 + log10l(n))
{
// If we haven't yet found the missing number
// for current length. Next number is n+2. Note
// that we use Log10 as (n+2) may have more
// length than n.
if ((missingNo == -1) &&
(getValue(str, i, 1+log10l(n+2)) == n+2))
{
missingNo = n + 1;
n += 2;
}
// If next value is (n+1)
else if (getValue(str, i, 1+log10l(n+1)) == n+1)
n++;
else
{
fail = true;
break;
}
}
if (!fail)
return missingNo;
}
return -1; // not found or no missing number
}
// Driver code
int main()
{
cout << findMissingNumber("99101102");
return 0;
}
Java
// Java program to find a missing number in a
// string of consecutive numbers without any
// separator.
class GFG {
static final int MAX_DIGITS = 6;
// gets the integer at position i with length m,
// returns it or -1, if none
static int getValue(String str, int i, int m) {
if (i + m > str.length()) {
return -1;
}
// Find value at index i and length m.
int value = 0;
for (int j = 0; j < m; j++) {
int c = str.charAt(i + j) - '0';
if (c < 0 || c > 9) {
return -1;
}
value = value * 10 + c;
}
return value;
}
// Returns value of missing number
static int findMissingNumber(String str) {
// Try all lengths for first number
for (int m = 1; m <= MAX_DIGITS; ++m) {
// Get value of first number with current
// length/
int n = getValue(str, 0, m);
if (n == -1) {
break;
}
// To store missing number of current length
int missingNo = -1;
// To indicate whether the sequence failed
// anywhere for current length.
boolean fail = false;
// Find subsequent numbers with previous number as n
for (int i = m; i != str.length(); i += 1 + Math.log10(n)) {
// If we haven't yet found the missing number
// for current length. Next number is n+2. Note
// that we use Log10 as (n+2) may have more
// length than n.
if ((missingNo == -1)
&& (getValue(str, i, (int) (1 + Math.log10(n + 2))) == n + 2)) {
missingNo = n + 1;
n += 2;
} // If next value is (n+1)
else if (getValue(str, i, (int) (1 + Math.log10(n + 1))) == n + 1) {
n++;
} else {
fail = true;
break;
}
}
if (!fail) {
return missingNo;
}
}
return -1; // not found or no missing number
}
// Driver code
public static void main(String[] args) {
System.out.println(findMissingNumber("99101102"));
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 program to find
# a missing number in a
# string of consecutive
# numbers without any
# separator.
import math
MAX_DIGITS = 6
# gets the integer at position
# i with length m, returns it
# or -1, if none
def getValue(Str, i, m):
if(i + m > len(Str)):
return -1
# Find value at index
# i and length m.
value = 0
for j in range(m):
c = (ord(Str[i + j]) -
ord('0'))
if(c < 0 or c > 9):
return -1
value = value * 10 + c
return value
# Returns value of missing
# number
def findMissingNumber(Str):
# Try all lengths for
#first number
for m in range(1, MAX_DIGITS + 1):
# Get value of first
# number with current
# length
n = getValue(Str, 0, m)
if(n == -1):
break
# To store missing number
# of current length
missingNo = -1
# To indicate whether
# the sequence failed
# anywhere for current
# length.
fail = False
# Find subsequent numbers
# with previous number as n
i = m
while(i != len(Str)):
# If we haven't yet found
# the missing number for
# current length. Next
# number is n+2. Note
# that we use Log10 as
# (n+2) may have more
# length than n.
if((missingNo == -1) and
(getValue(Str, i, 1 +
int(math.log10(n + 2))) ==
n + 2)):
missingNo = n + 1
n += 2
# If next value is (n+1)
elif((getValue(Str, i, 1 +
int(math.log10(n + 1))) ==
n + 1)):
n += 1
else:
fail = True
break
i += 1 + int(math.log10(n))
if(not fail):
return missingNo
# not found or no
# missing number
return -1
# Driver code
print(findMissingNumber("99101102"))
# This code is contributed by avanitrachhadiya2155
C#
// C# program to find a missing number in a
// string of consecutive numbers without any
// separator.
using System;
public class GFG {
static readonly int MAX_DIGITS = 6;
// gets the integer at position i with length m,
// returns it or -1, if none
static int getValue(String str, int i, int m) {
if (i + m > str.Length) {
return -1;
}
// Find value at index i and length m.
int value = 0;
for (int j = 0; j < m; j++) {
int c = str[i + j] - '0';
if (c < 0 || c > 9) {
return -1;
}
value = value * 10 + c;
}
return value;
}
// Returns value of missing number
static int findMissingNumber(String str) {
// Try all lengths for first number
for (int m = 1; m <= MAX_DIGITS; ++m) {
// Get value of first number with current
// length/
int n = getValue(str, 0, m);
if (n == -1) {
break;
}
// To store missing number of current length
int missingNo = -1;
// To indicate whether the sequence failed
// anywhere for current length.
bool fail = false;
// Find subsequent numbers with previous number as n
for (int i = m; i != str.Length; i += 1 + (int)Math.Log10(n)) {
// If we haven't yet found the missing number
// for current length. Next number is n+2. Note
// that we use Log10 as (n+2) may have more
// length than n.
if ((missingNo == -1)
&& (getValue(str, i, (int) (1 + Math.Log10(n + 2))) == n + 2)) {
missingNo = n + 1;
n += 2;
} // If next value is (n+1)
else if (getValue(str, i, (int) (1 + Math.Log10(n + 1))) == n + 1) {
n++;
} else {
fail = true;
break;
}
}
if (!fail) {
return missingNo;
}
}
return -1; // not found or no missing number
}
// Driver code
public static void Main() {
Console.WriteLine(findMissingNumber("99101102"));
}
}
//This code is contributed by PrinciRaj1992
Javascript
输出:
100