CodeFights年份转世纪代码无法通过隐藏测试,求修正方案
解决年份转世纪的隐藏测试用例问题
我一眼就瞅出你的代码里藏着一个容易忽略的小bug,这应该就是导致隐藏测试用例失败的关键!
先帮你拆解问题:
- 你的核心逻辑是判断年份是否需要加1得到对应世纪,但你用了
year%10==0作为判断条件——这完全错了! - 我们判断一个年份是否属于前一个世纪的最后一年,应该看它是不是整百年(比如1900、2000),也就是用
year%100==0,而不是整十年(比如1910、1920)。举个典型反例:1910年按你的代码会返回19,但实际上1910年属于20世纪,这类用例大概率就是隐藏测试里的“坑”。
另外,你的代码里那个while循环完全没必要,题目已经明确输入范围是1<=year<=2005,这个循环只会执行一次,去掉它代码会更简洁。
修正后的代码(基础版)
int centuryFromYear(int year) { int x = year / 100; if (year % 100 == 0) { return x; } else { return x + 1; } }
更简洁的写法(推荐)
利用整数除法的特性,我们可以一行代码搞定,而且能覆盖所有边界情况:
int centuryFromYear(int year) { return (year + 99) / 100; }
这个写法的原理是:对于非整百年份,加上99后再做整数除法,相当于对year/100向上取整;整百年份加上99后除以100的结果和原商一致,完美符合世纪的计算规则。比如:
- 1年:
(1+99)/100 = 1(正确,1世纪) - 1900年:
(1900+99)/100 = 19(正确,19世纪) - 1999年:
(1999+99)/100 = 20(正确,20世纪) - 2005年:
(2005+99)/100 = 21(正确,21世纪)
内容的提问来源于stack exchange,提问作者Sathya Srivatsav
相关产品推荐
相关产品推荐

