本文已参与「新人创作礼」活动,一起开启掘金创作之路。
蓝桥杯练习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;
}
};