寻找下一个Aloha Number

时间:2014-09-13 13:38:43

标签: objective-c algorithm

我在其中一个编码练习网站发现了这个问题......问题如下。

如果一个数字完全由4s和7s组成,则该数字被称为 aloha数。以下是 Aloha Numbers

的几个例子
  • 4477
  • 47744477

你的程序将得到一个非Aloha数的整数,你的输出必须返回该输入的下一个Aloha数(,以字符串的形式)。

示例1

输入: 1234

输出: 4444

示例2

输入: 4472

输出: 4474

  • 输入数字表示1到2 *(10 ^ 9)
  • 之间的整数
  • 输入数字不是Aloha数字

我试图解决这个问题,如下所示..

- (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 ++代码。

提前致谢。

1 个答案:

答案 0 :(得分:0)

尽管我上面的评论,我还是想知道&#34;时间和空间的复杂性&#34;。事实证明这是微不足道的;这只需要3个长整型变量和每个输入数字上的一个循环(可以通过此算法递增以使用1个以上的数字;这不会导致整数溢出)。

从最低位开始,如果它低于4,请将其替换为4。如果它低于7,请将其替换为7。对于89,请将其替换为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;
}