我正在练习面试算法,并在Career Cup和SO上遇到了这个问题 添加剂序列号在以两种不同数字形式分开时添加剂序列号。
Ex: 1235 (split it 1,2,3,5)
Ex: 12122436(split 12,12,24,36)
给定范围找到所有加性序列号?
以下是我尝试的内容,我知道它效率不高,不确定其复杂程度。此外,它没有找到像我感兴趣的53811和12122436这样的数字。如果有人可以指导我正确的方向或提出更简单有效的方法,我将非常感激。谢谢!
#include <stdio.h>
void check_two_num_sum(int,int);
void check_sum(int);
int flag = 0;
int main(){
int high,low;
printf("Enter higher range\n");
scanf("%d",&high);
printf("Enter lower range\n");
scanf("%d",&low);
check_two_num_sum(high,low);
return 0;
}
void check_two_num_sum(int high, int low)
{
flag=0;
for(low;low<high;low++)
{
check_sum(low);
if(flag==1)
{
printf("this value has additive sequence %d \n",low);
flag = 0;
}
}
}
void check_sum(int input)
{
int count = 1;
int capture, result, temp_res=0, n=0;
if(n==0){
result = input%10;
n++;
input = input/10;
capture = input;
}
while(input!=0)
{
temp_res = temp_res + input%10;
if(count ==2)
{
if(result == temp_res)
{
if(capture < 100)
{ flag = 1;
break;
}
else{
check_sum(capture);
}
}
else {
break;
}
}
count++;
input = input/10;
}
}
答案 0 :(得分:1)
我不确定它会有多高效,但我可能会尝试递归。
例如,53811
指向字符串的结尾,比方说。
Var2 = 1
Var1 = 1
检查Var0
是否等于Var2 - Var1
1 - 1
不等于8
,因此该函数的这一部分被终止。
在函数的下一个链中,Var2
等于最后两位数11
; Var1 = 8
检查Var0
是否等于Var2 - Var1
11 - 8
等于3
因此该函数的这一部分继续:Var2 = 8
; Var1 = 3
检查Var0
是否等于Var2 - Var1
8 - 3
等于5
,这也是字符串的结尾,因此函数返回True
基本情况似乎是指针位于字符串的开头或者没有可行的变量可以测试。在每个交接点,Var2
和Var1
将相应地改变以开始新的链; Var0
是从其他两个推断出来的。
答案 1 :(得分:0)
假设原始序列的长度为n。一个可行的明显方法是强力枚举第一个和第二个元素的长度,并检查它在线性时间内是否正确。这种方法需要O(n ^ 3)
时间。
您声称您的方法需要O(n)
时间,但是从您的实施情况来看,我怀疑您的n
是否表示原始序列的长度。