题目来源:力扣(LeetCode
)
链接:https://leetcode-cn.com/problems/palindrome-number
难度:简单
题目描述
给你一个整数 x
,如果 x 是一个回文整数,返回 true
;否则,返回 false
。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121
是回文,而 123
不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121
。 从右向左读, 为 121-
。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01
。因此它不是一个回文数。
示例 4:
输入:x = -101
输出:false
提示:
-231 <= x <= 231 - 1
第一次提交
看完这个题,特别是用例和结果,我发现和昨天分享的那中解法,刚好也可以用到这里,所以很多,我有了第一种解法:
class Solution {
public boolean isPalindrome(int x) {
if (x < 0) {
return false;
}
int n = 0;
int temp = x;
while (x != 0) {
n = n * 10 + x % 10;
x = x / 10;
}
return n == temp;
}
}
从提交结果来看,还是挺不错的。我们来简单说下思路,根据题目描述,回文数特点有一下几点:
- 正序和反序(反转)数值一样
- 负数都不是回文数
所以第一种解法就是将目标数反转,先判断是否为负数,负数直接返回false
,然后计算目标数值的反转数,比较反转前和反转后是否一致,一致就是回文数,否则就不是
第二次提交
其实,第二次可能是大部分人的思路(包括我),如果不是刚做完整数反转,那我可能也这么做了:
class Solution {
public boolean isPalindrome(int x) {
if (x < 0) {
return false;
}
boolean isPalindrome = false;
String xStr = String.valueOf(x);
char[] chars = xStr.toCharArray();
for (int i = 0; i <= chars.length / 2; i++) {
isPalindrome = (chars[i] == chars[chars.length -1 -i]);
if (!isPalindrome) {
return isPalindrome;
}
}
return isPalindrome;
}
}
提交结果和第一次差不多,但是时间上比第一次长了一点。这里的思路就很简单了,就是挨个比较,比较数字长度的一半就可以:
简单优化
把上面的代码做了一些简单的优化修改,内存消耗方面有了较大的提升:
class Solution {
public boolean isPalindrome(int x) {
if (x < 0) {
return false;
}
char[] chars = String.valueOf(x).toCharArray();
for (int i = 0; i <= chars.length / 2; i++) {
if (!(chars[i] == chars[chars.length -1 -i])) {
return false;
}
}
return true;
}
}
当然如果从代码的可读性上讲,第一种会比第二种更好,但是算法往往是考虑性能的是,所以如果单纯从算法角度来说,第二种更好。
总结
算法问题永远不会是唯一解,解决问题的关键在于你要有正确的解题思路,而思路的建立又依托于你对问题的建模能力(抽象化思维),建模能力又是靠不断地解决问题积累的,总结下就是算法考察的是你的逻辑思维(数学能力)和抽象化思维(实际问题抽象成模型,将问题与模型匹配,选择更合适的模型),看你是否可以将这两者很好的结合,写出最优解,毕竟日常工作中,一切业务逻辑本质上都是算法,一切业务逻辑的实现过程就是建立算法的过程,所以算法能力就是你编程能力的体现。
作为一个开发工程师,算法能力是最基本但特别重要的能力,这个能力和语言、系统、环境无关无关的,但很大程度上决定了你在这个行业能走多远,毕竟大厂对于算法都是有要求的,如果你的算法能力很差,没人会相信你能写出好代码。好了,今天就到这里吧,一定要坚持学习哦!
项目路径:
https://github.com/Syske/example-everyday
本项目会每日更新,让我们一起学习,一起进步,遇见更好的自己,加油呀