算法题
- 奥数题:假如电子记时器所显示的十个数字是“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]) {
NSString *strOfPreFour = [self getPre4StringWithString:[self intToString:i] dayString:[self intToString:j]];
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];
}
int lessSixCount = 0;
for (int p = 0; p < sixArray.count; p++) {
if ([sixArray[p] intValue] < 6) lessSixCount++;
}
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);
}
- (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;
}
- (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;
}