牛客网:好数问题详解
题目要求
题号:NC216068
判断一个数是否为"好数"。好数的定义:若一个数的首位和末位相等,则定义这个数为"好数"。
例如:
- 1231、4512394是好数(首位和末位都相等)
- 12345、768740不是好数(首位和末位不相等)
解题思路
要判断一个数是否为好数,我们需要提取这个数的首位和末位,然后判断它们是否相等。
- 提取末位:一个数的末位是个位数,可以通过对10取余(
x % 10
)获得。 - 提取首位:我们可以不断除以10直到数字小于10,此时剩下的就是首位。
代码实现
bool judge(int x) {
// 获取末位数字
int a = x % 10;
// 不断除以10,直到获取首位数字
while(x >= 10)
x /= 10;
// 判断首位和末位是否相等
return x == a;
}
代码分析
-
int a = x % 10;
- 通过对10取余,获取原数字的末位。例如,1231 % 10 = 1,这样就得到了末位1。 -
while(x >= 10) x /= 10;
- 这个循环会持续将数字除以10,直到数字小于10为止。- 例如,对于1231:
- 第一次:1231 / 10 = 123
- 第二次:123 / 10 = 12
- 第三次:12 / 10 = 1
- 此时x = 1,小于10,跳出循环,我们成功获取了首位数字1。
- 例如,对于1231:
-
return x == a;
- 比较首位和末位是否相等,如果相等返回true(是好数),否则返回false(不是好数)。
复杂度分析
- 时间复杂度:O(log n),其中n是输入的数字。因为我们需要不断地除以10,直到得到首位,这个过程的复杂度与数字的位数成正比,而数字的位数是log₁₀n。
- 空间复杂度:O(1),只使用了常数级别的额外空间。
测试用例分析
-
输入:1231
- 末位:1231 % 10 = 1
- 循环除以10:1231 -> 123 -> 12 -> 1
- 首位:1
- 1 == 1,返回true
-
输入:4
- 末位:4 % 10 = 4
- 由于4 < 10,不进入循环
- 首位就是4本身
- 4 == 4,返回true
-
输入:100
- 末位:100 % 10 = 0
- 循环除以10:100 -> 10 -> 1
- 首位:1
- 1 != 0,返回false
小技巧
这类问题也可以通过转换为字符串来解决,但用数学方法处理通常更高效,尤其是在处理大数字时。
如果考虑转换为字符串的方法,可以这样实现:
bool judge(int x) {
string s = to_string(x);
return s[0] == s[s.length() - 1];
}
但数学方法更为直接,效率也更高。