Objective c 查找下一个Aloha号码
我在一个编码实践站点中发现了这个问题…问题如下 如果一个数字完全由4s和7s组成,则称之为aloha数字。下面是阿洛哈数的几个例子 4477 47744477 您的程序将获得一个非Aloha数的整数,并且您的输出必须以字符串的形式返回该输入的下一个Aloha数 例1 输入:1234 产出:4444 例2 输入:4472 产出:4474 输入数字表示1和2*10^9之间的整数 输入编号不是Aloha编号 我试着解决这个问题如下Objective c 查找下一个Aloha号码,objective-c,algorithm,Objective C,Algorithm,我在一个编码实践站点中发现了这个问题…问题如下 如果一个数字完全由4s和7s组成,则称之为aloha数字。下面是阿洛哈数的几个例子 4477 47744477 您的程序将获得一个非Aloha数的整数,并且您的输出必须以字符串的形式返回该输入的下一个Aloha数 例1 输入:1234 产出:4444 例2 输入:4472 产出:4474 输入数字表示1和2*10^9之间的整数 输入编号不是Aloha编号 我试着解决这个问题如下 - (NSString *) nextAlohaNumber:(NSU
- (NSString *) nextAlohaNumber:(NSUInteger) number{
// method convertNumberIntoDigit return a array of digits present in input number
NSMutableArray *numberDigits = [self convertNumberIntoDigit:number];
NSUInteger tempNum;
for(int index = 0; index < numberDigits.count; index++){
tempNum = [[numberDigits objectAtIndex:index] intValue];
if(4 != tempNum && 7 != tempNum){
if(4 > tempNum){
[numberDigits replaceObjectAtIndex:index withObject:[NSNumber numberWithInt:4]];
}else if (7 > tempNum){
[numberDigits replaceObjectAtIndex:index withObject:[NSNumber numberWithInt:7]];
}
else if(7 < tempNum){
[numberDigits replaceObjectAtIndex:index withObject:[NSNumber numberWithInt:4]];
int previousIndex = index-1;
int previousNum = [[numberDigits objectAtIndex:previousIndex] integerValue];
if(previousIndex ){
if(4 == previousNum){
[numberDigits replaceObjectAtIndex:previousIndex withObject:[NSNumber numberWithInt:7]];
}
else if(7 == previousNum){
[numberDigits replaceObjectAtIndex:index withObject:[NSNumber numberWithInt:4]];
}
}
}
}
}
return [self numberArrayToStr:numberDigits]; // convert strings with digit in Array
}
但是这种方法并不能通过所有的测试用例,例如,它在输入4478、790等方面失败。
任何人都可以帮助我解决这个问题,为所有输入更好的时间和空间复杂性
PS:我对C、C++代码也很好。
提前谢谢。尽管我在上面发表了评论,我还是想知道时间和空间的复杂性。结果证明是微不足道的;这只需要3个长整数变量和每个输入数字上的一个循环,可以通过此算法增加以使用1个以上的数字;这不会导致整数溢出 从最低数字开始,如果低于4,则替换为4。如果低于7,则将其替换为7。对于8和9,将其替换为4并增加下一个数字。重复此操作,直到处理完所有数字 下面的代码返回正确的aloha数的数字本身,如果不是,则返回下一个更高的数字 它需要使用超过32位的长变量,因为允许的最大输入2*10^9的aloha数为4444-超出32位整数的范围
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
long not_aloha, aloha, digit;
if (argc != 2)
{
printf ("please give an aloha number\n");
return -1;
}
not_aloha = atoi (argv[1]);
printf ("not aloha: %ld\n", not_aloha);
aloha = 0;
digit = 1;
while (not_aloha)
{
if ( (not_aloha % 10) <= 4)
aloha += 4*digit;
else if ( (not_aloha % 10 ) <= 7)
aloha += 7*digit;
else
{
aloha += 4*digit;
not_aloha += 10;
}
digit *= 10;
not_aloha /= 10;
}
printf ("aloha: %ld\n", aloha);
return 0;
}
因此,您的代码无法工作,您需要有人编写能够工作的代码。恐怕不是这样的。此外你的代码既不是C也不是C++。请把你的标签更新。@ JunWue&EyNET4我知道这段代码是Objto-C,因为我写了这个,我不想任何人为我写任何代码。我已经写了一些代码。对于某些特殊情况,它不适用。我只是要求人们在这些情况下提出建议。我认为这个地方已经完全是这样了,不是吗?你的错误似乎是,当把一个大于7的数字改成4时,你忘了在左边的数字上加1。如果是4或7,您应该在测试之前这样做,并且您不需要单独的测试,因为它将在下一个循环迭代中进行。感谢@Jongware提供的信息性评论…您是对的,我忘记添加一个数字。这将为15给出错误的答案,即47而不是44。