小王的Java刷题日记Day1
记录刷题过程,作为笔记和分享,坚持每天刷题,每天进步,编程语言为Java。
1、
题目:给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
思路一:枚举法 双for循环 时间复杂度为O(n^2)
首先先固定i=0,让 j 往后不断移动,若没有nums[0]+nums[j]==target时,则让 i 往后移动一位,
此时变为nums[1].。而此时j=i+1=2,继续往后移动去判断是否加和为target,是的话则输出。
class Solution {
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (nums[i] + nums[j] == target) {
return new int[]{i, j};
}
}
}
return new int[0];
}
}
思路二:用哈希表 时间复杂度为O(n)
每次查询都能知道nums中是否有等于 target−nums[j]的值,也就是通过 j 的不断后移,用target−nums[j]去判断 j 的前边是否存在x,这样只需要从前到后移动一遍 j 即可得到我们想要的x。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer>idx=new HashMap<>();
for(int j=0;;j++){
int x=nums[j];
if(idx.containsKey(target-x))
return new int[]{idx.get(target-x),j};
idx.put(x,j);
}
}
}
2、
题目:给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
思路一:交换 双指针
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
//两个指针i和j
int j = 0,x; //x:存储交换值
for(int i=0;i<nums.length;i++) {
//当前元素!=0,就把其交换到左边,等于0的交换到右边
if(nums[i]!=0) {
x= nums[i];
nums[i] = nums[j];
nums[j++] = x; //j也需要向前移动
}
}
}
}
思路二:覆盖
将不为0的都前移,移动完之后剩余部分则是应当为0的,遍历剩余部分填入0即可。
class Solution {
public void moveZeroes(int[] nums) {
int s=0; //用来存储
//存储不是0的数
for (int i = 0; i < nums.length ;i++) {
if(nums[i]!=0){
nums[s++] = nums[i];
}
}
//前边都不是0,后边都是0了,遍历加入
for (int i = s; i < nums.length; i++) {
nums[i]=0;
}
}
}