leetcode(9) Palindrome Number

来源:互联网 发布:视频展示台软件 编辑:程序博客网 时间:2024/05/20 06:04

Problem

Determine whether an integer is a palindrome. Do this without extra space.

首先明确一个概念,“什么是不使用额外空间”,这是在leetcode上的一个回答:

“without extra space” usually means with O(1) space. so if you use a temp variable you’e still using O(1) space and it is fine. But you should be more specific about the problem you’re talking about.

stackoverflow上的一个关于O(1)和no extra space区别的回答:
stackoverflow这里说时间复杂度是算法所用总空间,例如我们在冒泡排序中是空间复杂度是O(n)

总之,在这个问题中我们就按照空间复杂度为O(1)的要求来做。

hints

在这个问题中要注意几点:

  1. 如果把int转换为str的话那么空间复杂度肯定就超过了O(1)
  2. 如果翻转数字的话有可能会造成溢出

所以我的想法就是利用求模和取余不断地获取int的某几位然后比较,这里需要注意的一点就是不能用求模获取一个数字的后几位,例如100021中如果求模的话会丢失中间的0。
基于这个思路这就产生了两种解法:

  1. 同时利用求模和取余获取x中的某一位,例如获取x=100021的第四位数,return (x//1000)%10
  2. 使用str转化成字符串再获取,str(x)[2]
    都不是太好的解法,学会避免其中的陷阱就行了,就不写出代码了。

Solution

public boolean isPalindrome(int x) {    if (x<0 || (x!=0 && x%10==0)) return false;    int rev = 0;    while (x>rev){        rev = rev*10 + x%10;        x = x/10;    }    return (x==rev || x==rev/10);}

这个算法的思路就是获取x的后一半数字的翻转,然后比较前一半和后一半。

时间复杂度:O(n),n为x的位数。
空间复杂度:O(1)

原创粉丝点击