代码随想录1


前言:
今天是第一次打卡,没有准备充分(也有一些懒惰的成分),只写了两道代码题,分别是二分法查找、数组元素移除。以后每天花至少三个小时来完成每天三道代码题的任务,并且花一个小时复盘代码题。
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;
    }
};

本题随想录链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值