【题目】LeetCode(9): Palindrome Number
URL: https://leetcode.com/problems/palindrome-number/
【描述】
Determine whether an integer is a palindrome. Do this without extra space.
【中文描述】
确定一个integer是否是回文数,类似于121, 2332, 1000001, 22这样的。做这个不使用额外空间!
————————————————————————————————————————————————————————————
【初始思路】
这个题我简直想杀人!!中文描述里,我故意直译了题目最后一句话,还专门用红色字体写出了这句话,就是这个要求折磨了我将近一天!!
Do this without extra space。这句话什么意思?我如果没有理解错,那就是不能使用额外空间!
什么是额外空间?我可以理解,除了x外,另外申请的都可以算作额外空间。哪怕是一个pointer,都是在栈里占用空间的啊! 这就意味着,你不能把integer转成string,不能获知这个integer的位数,你所有的代码,都只能用一个变量,就是这个x。
思来想去,想了一整天无果。最后,吃完晚饭,没办法,穷途末路了,心想一个easy题居然被我做成这样!还是回国吧,不要想google、facebook了。结果看了别人的答案,我简直疯掉!明明有用额外空间啊!有一个人还在discuss里问:”我这个题没有用额外空间么?为什么还是AC了?“ 看来大家都和我一样的烦恼!
好吧,如果可以用额外空间,这个题就真是太简单了。不多分析了,直接上代码,case closed!
【Show me the Code!!!】
1 public static boolean isPalindrome(int x) { 2 if(x < 0) {return false;} //负数肯定不是,直接返回 3 if(x >= 0 && x < 10) {return true;}//0-9肯定是,直接返回 4 5 //正数情况 6 String str = String.valueOf(x); 7 8 int count = 0; 9 int i = 0, j = str.length() - 1; 10 while(count < str.length() / 2) { //回文数,只需要匹配两边的就可以了. 奇数位数时,除去中间匹配两边. 11 if(str.charAt(i) == str.charAt(j)) { 12 count++; 13 i++; 14 j--; 15 } else { 16 return false; //一旦发现不匹配立马返回false 17 } 18 } 19 return true; 20 }
【反思】
这个题让我认识到一个问题,实在想不出来的题还是赶紧看提示看discuss吧,毕竟面试的时候还可以和面试官沟通要tip的。死磕到最后只能是浪费时间!