此篇文章用户记录leetcode的简单题
leetcode9给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
分析 看到这道题目首先我想的是反证法比如121是不是一个回文数只需要把他反过来121看两数是否需要相等即可,但是发现编译报错,这是因为int类型可能会爆表,比如x = 2,147,483,646 也就是反过来一定会超出范围所以不可行,我们只需要比较一半就可以定义一个revertedNumber 当x > renvertedNumber去做比较即可 代码如下
class Solution {
public boolean isPalindrome(int x) {
if(x < 0 || (x % 10 == 0 && x != 0)){
return false;
}
int revertedNumber = 0;
while(x > revertedNumber){
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
return x == revertedNumber || x == revertedNumber / 10;
}
}
LeetCode27:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
分析 双指针法: 一个指针指向有效元素个数 另一个指针用来判断是不是要移除的数字,如果不是要移除的数字那么就把他给有效数字的指针即可,然后有效指针自增。代码如下
public int removeElement(int[] nums, int val) {
if (nums == null || nums.length == 0)
return 0;
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != val) {
nums[j] = nums[i];
j++;
}
}
return j;
}
双指针优化 如果要移除的元素恰好在数组的开头,例如序列 [1,2,3,4,5],当 val 为 1 时,我们需要把每一个元素都左移一位。注意到题目中说:「元素的顺序可以改变」。实际上我们可以直接将最后一个元素 5 移动到序列开头,取代元素 1,得到序列 [5,2,3,4][5,2,3,4],同样满足题目要求。这个优化在序列中 元素的数量较少时非常有效。此方法借鉴了leetcode官方。
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0;
int right = nums.length;
while (left < rig