【基础算法】浅浅刷个小题 # 搜索插入位置 # 各位相加 # 寻找数组的中心下标 #



C/C++学习路线 (点击解锁)(●’◡’●)
❤️C语言
❤️初阶数据结构与算法
❤️C++
❤️高阶数据结构
❤️Linux系统编程与网络编程

前言

有些简单题在leetcode上实际上不简单,相信大家有和我相同的感觉。
(/(ㄒoㄒ)/~~)
下面是我认为真正符合简单一词的三个题目,我来分享以下我的解体思路。

1. 第35题:搜索插入位置

  • 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

  • 【示例 1】:

    输入: nums = [1,3,5,6], target = 5
    输出: 2

  • 【示例 2】:

    输入: nums = [1,3,5,6], target = 2
    输出: 1

  • 【示例 3】:

    输入: nums = [1,3,5,6], target = 7
    输出: 4

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-insert-position

  • 题目意思很明确,给定一个升序数组和一个目标值,如果数组中某个元素和目标值相等,返回其下标。
  • 如果 目标值不存在于数组中,返回他将会按顺序插入的位置,也就是说,示例2中 (目标值2) 在数组中的元素1和3之间,所以2应当被认为插入1和3之间,然后返回其下标,也就是1。
  • 示例3为例外,就是目标值比所有数组里的元素都要大,这时认为目标值放在数组的最后一个元素的后面,再返回其下标,也就是整个数组的大小。

以下是代码实现:

int searchInsert(int* nums, int numsSize, int target){
    int i = 0;
    for (i = 0; i < numsSize; i++)
    {
        if (nums[i] == target || nums[i] >= target) // 判断是否相等或者是否小于等于后一个元素
        {
            return i;
        }
    }
    return numsSize; // 如果上面循环结束都不成立,那么就是数组中没有目标值且该值比数组中所有的元素都要大。所以直接放在数组最大的元素的后面,也就是要返回数组的大小。
}
  • 我们可以用一个循环来遍历数组,如果数组元素与目标值相等,直接返回其下标。
  • 如果目标值刚好比升序数组的一个元素小或相等,则返回这个元素的下标(可以说是目标值把这个元素挤开占有其下标)。
  • 如果循环内条件都不成立,在后面直接return数组的大小(目标值可以直接放在后面)。

2. 第258题:各位相加

  • 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。

  • 【示例 1】:

    输入: num = 38
    输出: 2
    解释: 各位相加的过程为:
    38 --> 3 + 8 --> 11
    11 --> 1 + 1 --> 2
    由于 2 是一位数,所以返回 2。

  • 【示例 2】:

    输入: num = 0
    输出: 0

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-digits

  • 由示例1不难看出,我们要重复将一个数的各个位相加直到这个数为一位数为止,由38为例,先相加每一位也就是3与8相加得到一个新的数11,此时判断11他不是1位数,那么此时继续相加每一位,也就是1与1相加得到2,这时判断2为1位数,那么return这个一位数也就是2;
  • 那么我们如何来使这个数的每一位相加呢?如果这个数不是38而是更多位数的数来每一位相加,这时又该怎么处理?本人用的是递归的思想来使其每一位相加,并且可以解决数的位数变化的问题。

先看代码:

int add_num(int n) // 进入递归函数
{
    if (n > 0) 
    {
        return n % 10 + add_num(n / 10); //递归
    }
    else
    {
        return 0;
    }
}

int addDigits(int num){
    while (num > 9) //如果num不是一位数就一直循环
    {
        num = add_num(num); //每循环一次各位相加一次,num的值就要变化
    }
    return num; //返回最终相加为一位数的num
}
  • 递归阶段:(num % 10)得到第一位数,再传(num / 10) 进入函数(除去加了的那一位),也就是前面的(num % 10)将要与第二位数相加,依次类推,当(num = 0)时返回0,实现每一位的相加。
  • 当 num = 0 时,while循环进不去,直接就返回num。

3. 第724: 寻找数组的中心下标

  • 给你一个整数数组 nums ,请计算数组的 中心下标 。

  • 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

  • 如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

  • 如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 - 1 。

  • 【示例 1】:

    输入:nums = [1, 7, 3, 6, 5, 6]
    输出:3
    解释:
    中心下标是 3 。
    左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
    右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。

  • 【示例 2】:

    输入:nums = [1, 2, 3]
    输出:-1
    解释:
    数组中不存在满足此条件的中心下标。

  • 【示例 3】:

    输入:nums = [2, 1, -1]
    输出:0
    解释:
    中心下标是 0 。
    左侧数之和 sum = 0 ,(下标 0 左侧不存在元素),
    右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-pivot-index

  • 这一题的题目明显要比上面两个题的题目要复杂,其意思其实就是:在数组的元素中,存在一个元素使得除其本身元素之外的左边的所有元素之和等于右边的所有元素之和,这时就称该元素的下标为数组的中心下标。
  • 我们要注意最左边和最右边的情况;
  • 要注意有多个中心下标时,返回最靠数组左边的下标,这里我们可以大致确定判断路径:遍历数组判断其每一个元素的左右边元素之和是否相等,那么如何来判断?
  • 中心下标的左边所有元素和右边所有元素之和相等,从这点出发,可以得到 中心下标左边的所有元素之和乘以二再加上中心下标元素的值是等于整个数组的元素之和的,就根据这点,判断的条件就是:中心下标左边的所有元素的和×2 + 中心下标的值 =?所有元素的和 (或者)所有元素的和减去中心下标的值是否等于中心下标左边所有的元素之和×2。

以下是代码实现:

int pivotIndex(int* nums, int numsSize) {
    int sum = 0,n = 0;
    for(int i = 0;i < numsSize;i++)
        sum = sum + nums[i];  //首先求出所有元素的和
    for(int i = 0;i < numsSize;i++){
        if(n * 2 == sum - nums[i]) //n开始为0就解决了在最左边的情况
            return i;              //减去nums[i]相当于减去中心下标的元素
        n = n + nums[i]; //每判断到下一个元素,讲左边元素的值加起来,相当于求中心下标左边所有元素之和
    }
    return -1; // 如果上面for循环都跳出没有返回,则返回-1(说明没有中心下标)。
}
  • 这是一个比较灵活的解法,相信大家一定还有更灵活的解法,把它留在评论区吧!

总结

leetcode上的题比较逻辑思维,算法能力和语法熟练度,每天都去动动自己的大脑,相信不久你就会从小白变为大白的!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简 料

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值