算法题

算法题


  • 奥数题:假如电子记时器所显示的十个数字是“0126093028”这样一串数,它表示的是1月26日9时30分28秒.在这串数里,“0”出现了3次,“2”出现了2次,“1”、“3”、“6”、“8”、“9”各出现1次,而“4”、“5”、“7”没有出现.如果在电子记时器所显示的这串数里,“0,1,2,3,4,5,6,7,8,9”这一个数字都只出现一次,称它所表示的时刻为“十全时”那么2003年一共有( )个这样的“十全时?

PS:算法完善打印每个十全时
- (void)get2003 {
    int result = 0;
    //每月多少天数组
    NSMutableArray *dayOfPerMonth = [NSMutableArray array];
    for (int i = 1; i < 13; i++) {
        [dayOfPerMonth addObject:[NSString stringWithFormat:@"%zd", [self howManyDaysInThisYear:2003 withMonth:i]]];
    }

    //二维数组创建
    NSMutableArray *dayArr = [NSMutableArray array];
    for (int i = 0; i < 13; i++) {
        [dayArr addObject:[NSMutableArray arrayWithCapacity:32]];
    }

    //初始化二维数组
    for (int i = 0; i < dayArr.count; i++) {
        for (int j = 0; j < 32; j++) {
            if (i > 0 && j > 0 && j <= [dayOfPerMonth[i==0 ? 0 : i-1] intValue]) {
                [dayArr[i] setObject:@1 atIndexedSubscript:j];
            }
            else {
                [dayArr[i] setObject:@0 atIndexedSubscript:j];
            }
        }
    }

    //得到前四位数的组合
    for (int i = 0; i < dayArr.count; i++) {
        for (int j = 0; j < 32; j++) {
            //第一次筛选
            if ([[dayArr[i] objectAtIndex:j] isEqualToValue:@1]) {
                //月日四位数0101
                NSString *strOfPreFour = [self getPre4StringWithString:[self intToString:i] dayString:[self intToString:j]];
                //判断四位数是否中是否重复或者同时包含0,1,2
                if (![self validateString:strOfPreFour]) {
                    [dayArr[i] setObject:@0 atIndex:j];
                }
            }
            //第二次筛选出结果
            if ([[dayArr[i] objectAtIndex:j] isEqualToValue:@1]) {

                //得到其余六位数
                NSString *strOfPreFour = [self getPre4StringWithString:[self intToString:i] dayString:[self intToString:j]];
                NSMutableArray *arr = [NSMutableArray array];
                for (int h = 0; h < strOfPreFour.length; h++) {
                    [arr addObject:[NSString stringWithFormat:@"%c", [strOfPreFour characterAtIndex:h]]];
                }

                //六位数组
                NSMutableArray *sixArray = [NSMutableArray arrayWithObjects:@"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9",nil];
                [sixArray removeObjectsInArray:arr];

                //六位字符串
                NSString *sixStr = [NSString string];
                for (NSString *str in sixArray) {
                    sixStr = [sixStr stringByAppendingString:str];
                }
                //判断六位数小于6的个数
                int lessSixCount = 0;
                for (int p = 0; p < sixArray.count; p++) {
                    if ([sixArray[p] intValue] < 6) lessSixCount++;
                }
                //判断有没有1,或2
                if (lessSixCount >= 3) {
                    if ([sixStr containsString:@"1"]) {
                        if (lessSixCount == 3) {
                            result += 12;
                            NSLog(@"%@--%@", strOfPreFour, sixStr);
                            //得到六位数字的数组
                            NSMutableArray *sixArray = [NSMutableArray arrayWithCapacity:6];
                            for (int i = 0; i < [sixStr length]; i++) {
                                [sixArray addObject:[NSString stringWithFormat:@"%c",[sixStr characterAtIndex:i]]];
                            }

                        }
                        else  {
                            result +=36;
                            NSLog(@"%@--%@", strOfPreFour, sixStr);
                        }
                    }
                    else if ([sixStr containsString:@"2"]) {
                        if (lessSixCount == 4) {
                            result += 4;
                            NSLog(@"%@--%@", strOfPreFour, sixStr);
                        }
                    }
                }
            }

        }
    }
    NSLog(@"2003年有%i个十全时", result);

}
/**
 *  判断四位数是否中是否重复或者同时包含0,1,2
 *  不满足条件返回NO
 */
- (BOOL)validateString:(NSString *)str {

    if ([str containsString:@"0"] && [str containsString:@"1"] && [str containsString:@"2"]) {
        return NO;
    }
    for (int k = 0; k < str.length; k++) {
        if ([[[str substringToIndex:k] stringByAppendingString:[str substringFromIndex:k+1]] containsString:[NSString stringWithFormat:@"%c", [str characterAtIndex:k]]]) {

            return NO;
        }
    }
    return YES;
}
/**
 *  int类型转换固定字符串,例子:1->01
 */
- (NSString *)intToString:(int)intVal {
    return intVal < 10 ? [NSString stringWithFormat:@"0%i", intVal] : [NSString stringWithFormat:@"%i", intVal];
}
/**
 *  得到月日四位数
 */
- (NSString *)getPre4StringWithString:(NSString *)monthStr dayString:(NSString *)dayStr {
    return [NSString stringWithFormat:@"%@%@", monthStr, dayStr];
}
/**
 *  获得某年某月的天数
 */
- (NSInteger)howManyDaysInThisYear:(NSInteger)year withMonth:(NSInteger)month{
    if((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12))
        return 31 ;

    if((month == 4) || (month == 6) || (month == 9) || (month == 11))
        return 30;

    if((year % 4 == 1) || (year % 4 == 2) || (year % 4 == 3))
        return 28;

    if(year % 400 == 0)
        return 29;

    if(year % 100 == 0)
        return 28;

    return 29;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值