代码随想录打卡第一天
前言:
今天是第一次打卡,没有准备充分(也有一些懒惰的成分),只写了两道代码题,分别是二分法查找、数组元素移除。以后每天花至少三个小时来完成每天三道代码题的任务,并且花一个小时复盘代码题。
PS:本人二战,由于专业课考数据结构算法题目,所以想通过打卡代码随想录的题目来提升自己的程序编写能力。尽量每天腾出几个小时来写代码和博客,希望自己能够坚持下去,加油!
今日题目
二分查找.
移除元素.
1.二分查找
这是一道比较典型的查找题目,具体题目内容和解题思路代码随想录已经写的很详细了,这里不再赘述。在写代码时,我出现的问题有:
变量命名冗余
有些变量命名多余,其实都可以删掉,过多的变量影响代码可读性
middle变量的值计算方法错误
这是我代码提交出错的直接原因。我写的公式为mid=(right-left)/2,这样显然计算不出数组中间位置。数组中间位置的计算公式为:
mid=(left+right)/2;//正确的
下面是正确的代码:
int search(int* nums, int numsSize, int target){
int left = 0;
int right = numsSize-1;
int mid=0;
while(left<=right){
mid=(left+right)/2;
if(target>nums[mid]){
left=mid+1;
}else if(target<nums[mid]){
right=mid-1;
}else{
return mid;
}
}
return -1;
}
2.移除元素
这道题目用到了双指针思想。双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。
这道题其实并不难,在考研代码题中遇到过此类题目。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
代码如下:
int removeElement(int* nums, int numsSize, int val){
int i=0;
int k=0;//用来标记数组元素与val相同的个数
for(i=0;i<numsSize;i++){
if(nums[i]!=val){
nums[i-k]=nums[i];//当元素值不等于val时,将该元素前移k个位置
}else{
k++;
}
}
return numsSize-k;//最后长度减去k即为最终数组长度
}
代码随想录解题代码:
// 时间复杂度:O(n)
// 空间复杂度:O(1)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;//慢指针
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};