从快期末考试的一个月到期末结束后的几天,差不多已经一个多月没有碰过java了,很多以前学的东西也忘记了。这一个星期差不多就是复习一下以前学过的东西,但是学习资源太多了,这几天基本是这个看一点,那个看一点。每个资料讲的顺序也不一样,所以复习起来太琐碎了。几天下来,感觉没学多少东西。
现在大概把基本数据类型、数组、类、各种数据的包装类、stringbuilder、修饰符、继承一些基本的知识过了一遍吧。学习感悟的话,光是看书或者是视频的话,感觉还是太无聊了,看不下去。所以看完一个知识点就对应的写一些demo,会更好,然后再去写一些算法题。当然很多算法题不会写很正常。先用笨方法写一遍,在去看看别人的解题思路(不要看代码),然后再自己根据思路去写一遍,再和别人的代码看一看有什么不同吧。以下是最近做的几个算法题
/*二分查找
* 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
*/
class Solution {
public int searchInsert(int[] nums, int target) {
int left=0,right=nums.length-1,mid=0;
while(left<=right) {
mid=(int)Math.round((left+right)/2.0);//第一次错了,没注意整数/整数还是整数;round返回的是一个long型(因为2.0默认是double型),要强制转换
if(target<numsmid]) {
right=mid-1;
}
else if(target>nums[mid]){
if(left==right) {
mid++;
}
left=mid;
}
else {
break;
}
}
return mid;
}
}
双指针
/*给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
*/
class Solution {
public int[] sortedSquares(int[] nums) {
int n=nums.length;
int i=0,j=n-1,k=1;
int []arr=new int [n];
while(i<=j) {
if(nums[i]*nums[i]<nums[j]*nums[j]) {
arr[n-k]=nums[j]*nums[j];
j--;
}
else {
arr[n-k]=nums[i]*nums[i];
i++;
}
k++;
}
return arr;
}
}
/*双指针
* 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
进阶:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
*/
class Solution2 {
public void rotate(int[] nums, int k) {
int n=nums.length;
int m=k%n;
reverse(nums,0,n-1);
reverse(nums,0,m-1);
reverse(nums,m,n-1);
}
int[] reverse(int []nums,int i,int j){
while(i<j) {
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
i++;
j--;
}
return nums;
}
}