要是能像一月份说的每天一道现在已经刷了一百多道了,唉,懒惰。
话不多说,这次写leetcode数组问题
283. Move Zeroes这道题很简单,思路就是遇到零跳过,不是零就拿出来覆盖掉是零的数,然后后面再不上所有的零
class Solution {
public void moveZeroes(int[] nums) {
int NoZeroIndex = 0 ;
for(int i = 0 ; i < nums.length ; i ++){
if(nums[i] != 0){
nums[NoZeroIndex] = nums[i] ;
NoZeroIndex++ ;
}
}
for(int i = NoZeroIndex ; i < nums.length ; i ++){
nums[i] = 0 ;
}
}
}
27. Remove Element这道题和上面差不多,遇到重复的就跳过
class Solution {
public int removeElement(int[] nums, int val) {
int NoEqualValIndex = 0 ;
for(int i = 0 ; i < nums.length ; i ++){
if(nums[i] != val){
nums[NoEqualValIndex++] = nums[i] ;
}
}
return NoEqualValIndex ;
}
}
26. Remove Duplicates from Sorted Array还是差不多相等就跳过不相等就继续
class Solution {
public int removeDuplicates(int[] nums) {
if(nums == null || nums.length == 0){
return 0 ;
}
int a = 0 ;
for(int i = 0 ; i < nums.length ; i ++){
if(nums[a] != nums[i]){
a ++ ;
nums[a] = nums[i];
}
}
// 要返回的是个数 a只是下标所以要加一
return a + 1 ;
80. Remove Duplicates from Sorted Array II这道题看着很简单还是有一些小技巧的,比如遍历的时候从一开始就可以直接看第二个相等的地方,如果从零开始就会导致count大于二时无法重置的等等问题,还是耗费了我一些时间才解决
class Solution {
public int removeDuplicates(int[] nums) {
if(nums == null || nums.length < 1){
return 0 ;
}
// 这个相当于双指针,一个指针比遍历的指针慢一步
int a = 0 ;
int count = 1 ;
// 这就是为什么要从一开始,遍历的指针比记号的指针快一步
for(int i = 1 ; i < nums.length ; i ++){
// 如果这里相等因为a和i差一位表明前一位和后一位相等了,已经有两次相等了
if(nums[a] == nums[i]){
// 所以这里是小于等于二能进来表明已经有两次相等了
if(count < 2){
nums[++a] = nums[i] ;
count ++ ;
}
}else{
nums[++a] = nums[i];
// 这里要重置count
count = 1 ;
}
}
// 加一是因为a是下标 , 比数组大小一个
return a + 1 ;
}
}