蓝桥杯练习002

122 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

蓝桥杯练习002

1.加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。

示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。

示例 3:

输入:digits = [0]
输出:[1]

提示:

1 <= digits.length <= 100
0 <= digits[i] <= 9

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/pl…

代码:

class Solution {
public:
    //digits是原来的数组
    vector<int> plusOne(vector<int>& digits) {
        //最后一位数加1,将carry赋初值为1,即最后一位加上carry即可
        int carry = 1;
        //用来存放结果的数组res
		vector<int> res;
        //从digits数组的尾端开始扫描,直到遍历到数组的第一个位置
		for(int i = digits.size()-1;i>=0;i--)
		{
            //用临时变量d存放每一位数字
            //由于最后的一位数要加上1,在这里加上carry
			int d = digits[i] + carry;
            //将数据存放到res数组中
			res.push_back(d%10);
            //carry表示是否有进位,无进位则为0
			carry = d /10;
		}
        //当carry大于0的时候,说明最后有进位,将最高位存放到数组中
		if(carry >0)
			res.push_back(carry);
        //通过push_back是将最低位存放到数组头,调用reverse将结果逆置
        reverse(res.begin(),res.end());
        //返回res数组
	    return res;
    }
};

2.合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。

示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

提示:

nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[j] <= 109

题目来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/me…

代码:

class Solution{
public:
    //nums1和nums2两个数组存放两组要输入的数据,m是nums1的元素个数,n为nums2的元素个数
	void merge(vector<int> &nums1,int m,vector<int> &nums2,int n)
	{
        //用i,j分别表示nums1与nums2的末尾的索引值
		int i = m - 1;
		int j = n - 1;
        //k表示合并后nums1最后的末尾位置的索引
		int k = nums1.size() - 1;
        //当i和j都大于0时,也就是nums1和nums2中都还有元素的时候执行循环体
		while(i >= 0 && j >= 0)
		{
            //当nums1中的元素比nums2中的元素小的时候,将nums2中的元素存放到数组中,并让j--找下一个元素
			if(nums1[i] <nums2[j])
				nums1[k--] = nums2[j--];
            //当nums1中的元素大于等于nums2中的元素时
            //将此处的nums1中的数存到nums1中
			else 
				nums1[k--] = nums1[i--];
		}
        //结束循环有两种情况,j不满足,i不满足
        //当i不满足时,也就是nums2中还有元素没有存放到数组nums1中,将剩余的数存到nums1中
		while(j >= 0)
			nums1[k--] = nums2[j--];
	}
};

3.搜索插入位置

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

请必须使用时间复杂度为 O(log n) 的算法。

示例 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

示例 4:

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

示例 5:

输入: nums = [1], target = 0
输出: 0

提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 为无重复元素的升序排列数组
-104 <= target <= 104

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/se…

代码:

class Solution {
public:
    //nums存放数据 target为目标值
    int searchInsert(vector<int>& nums, int target) {
        //开始设置两个哨兵,在数组的两端lo为-1,hi为数组的长度
        int lo = -1;
		int hi = nums.size();
        //当lo和hi两个哨兵没有碰头的时候执行循环体
		while(lo + 1 < hi)
		{
            //由于是已经升序排列的数组,只考虑一半的数据即可
            //mid是中间位置
			int mid = lo + (hi - lo) / 2;
			//采用折半查找的方式,当目标值大于中间的数据时,将左边的哨兵的位置移到中间位置
         	//不再考虑左半部分
            //如果不是这样,而是中间位置的数据大于等于目标值数据,则考虑左半部分,将右边的哨兵修改为mid
            if(target > nums[mid])
				lo = mid;
			else 
				hi = mid;
		}
        //将索引位置返回,不管目标值在不在数组中,如果在,就是目标值位置,如果不在,也是要插入的位置
		return hi;
    }
};

创作打卡挑战赛

赢取流量/现金/CSDN周边激励大奖