我在其中一个编码练习网站发现了这个问题......问题如下。
如果一个数字完全由4s和7s组成,则该数字被称为 aloha数。以下是 Aloha Numbers
的几个例子你的程序将得到一个非Aloha数的整数,你的输出必须返回该输入的下一个Aloha数(,以字符串的形式)。
示例1
输入: 1234
输出: 4444
示例2
输入: 4472
输出: 4474
我试图解决这个问题,如下所示..
- (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 ++代码。
提前致谢。
答案 0 :(得分:0)
尽管我上面的评论,我还是想知道&#34;时间和空间的复杂性&#34;。事实证明这是微不足道的;这只需要3个长整型变量和每个输入数字上的一个循环(可以通过此算法递增以使用1个以上的数字;这不会导致整数溢出)。
从最低位开始,如果它低于4
,请将其替换为4
。如果它低于7
,请将其替换为7
。对于8
和9
,请将其替换为4
并增加 next 数字。重复,直到处理完所有数字。
以下代码返回正确的&#34; aloha&#34;如果不是,那么下一个更高。
它需要long
个变量(使用超过32位),因为最大允许输入的aloha数,2 *(10 ^ 9),是4444444444
- 超出范围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;
}