C/C++学习路线 (点击解锁)(●’◡’●) |
---|
❤️C语言 |
❤️初阶数据结构与算法 |
❤️C++ |
❤️高阶数据结构 |
❤️Linux系统编程与网络编程 |
- 坚持不一定会有效果,但一定会有意义。
- 本章题目的难易程度为:简单。
283. 移动零
- 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
- 请注意 ,必须在不复制数组的情况下原地对数组进行操作。
-
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0] -
示例 2:
输入: nums = [0]
输出: [0]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/move-zeroes
解题思路:
- 首先创建两个变量 (left = 0;right = 0) (也可以用指针)分别初始化零(相当于数组第一个元素的下标),用 nums[right] 去遍历数组,当nums[right] 为零时, right++ 为下一个元素的下标,left不变,也就是说,left用来跟随为零的元素,right则跟随不是零的元素,当nums[right] 不是零时,将nums[right] 的值与nums[left] 的值交换,随后left++ 。(当不是零时,left与right都加加为下一个元素的下标,这里交换实际上没变化)。
下面是C语言代码实现:
void moveZeroes(int* nums, int numsSize) {
int left = 0;
int right = 0;
while (right < numsSize)
{
if (nums[right])
{
int tmp = nums[right];
nums[right] = nums[left];
nums[left] = tmp;
left++;
}
right++;
}
}
268. 丢失的数字
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
-
示例 1:
输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。 -
示例 2:
输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。 -
示例 3:
输入:nums = [9,6,4,2,3,5,7,0,1]
输出:8
解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。 -
示例 4:
输入:nums = [0]
输出:1
解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/missing-number
解题思路:
- 由题目意思我们可以这样操作:
只要将范围以内的所有值的和减去数组所有元素的和便可以得到那个消失的数字。
下面是C语言代码实现:
int missingNumber(int* nums, int numsSize){
int sum1 = 0;
int sum2 = 0;
for (int i = 0; i < numsSize; i++)
{
sum1 += nums[i];
}
for (int j = 0; j <= numsSize; j++)
{
sum2 += j;
}
return sum2 - sum1;
}
709. 转换成小写字母
给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。
-
示例 1:
输入:s = “Hello”
输出:“hello” -
示例 2:
输入:s = “here”
输出:“here” -
示例 3:
输入:s = “LOVELY”
输出:“lovely”
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/to-lower-case
解题思路:
首先介绍两个函数:
- isupper :判断一个字母是否为大写字母,如果是返回一个大于零的数
- tolower :将大写字母转为小写字母
- 有了这两个函数,我们可以用 isupper 判断每一个字母是否为大写字母,如果是就用 tolower 将该字母转化为小写并放入对应数组元素中,这样便可以很好的转换。
下面是C语言代码实现:
char * toLowerCase(char * s){
int len = strlen(s);
for (int i = 0; i < len; i++)
{
if (isupper(s[i]) > 0)
{
s[i] = tolower(s[i]);
}
}
return s;
}
1304. 和为零的 N 个不同整数
给你一个整数 n,请你返回 任意 一个由 n 个 各不相同 的整数组成的数组,并且这 n 个数相加和为 0 。
-
示例 1:
输入:n = 5
输出:[-7,-1,1,3,4]
解释:这些数组也是正确的 [-5,-1,1,2,3],[-3,-1,2,-2,4]。 -
示例 2:
输入:n = 3
输出:[-1,0,1] -
示例 3:
输入:n = 1
输出:[0]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-n-unique-integers-sum-up-to-zero
解题思路:
- 由题目意思,我们只需要返回一个符合题目要求的数组即可;
- 所以我们可以这样:将数组最后一个元素设为其前面所有元素的和的负数,这样既符合题目要求,并且操作起来简易。
以下是C语言代码实现:
int* sumZero(int n, int* returnSize){
*returnSize = n;
int* ret = (int*) malloc(n*sizeof(int));
int sum = 0;
for (int i=1; i<n; i++) {
sum +=i;
ret[i-1] = i;
}
ret[n-1] = -sum;
return ret;
}
LCP 01. 猜数字
这一题可以说是我在力扣上找回自信的一题,这里不做讲解,直接看题目与代码很容易理解。
题目:
- 小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?
- 输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。
-
示例 1:
输入:guess = [1,2,3], answer = [1,2,3]
输出:3
解释:小A 每次都猜对了。 -
示例 2:
输入:guess = [2,2,3], answer = [3,2,1]
输出:1
解释:小A 只猜对了第二次。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/guess-numbers
以下是C语言代码实现:
int game(int* guess, int guessSize, int* answer, int answerSize){
int count = 0;
for (int i = 0 ; i < guessSize; i++)
{
if (guess[i] == answer[i])
{
count++;
}
}
return count;
}
At the end
一件事只要你坚持得足够久, “坚持”就会慢慢变成“习惯”。 原本需要费力去驱动的事情就成了家常便饭, 原本下定决心才能开始的事情也变得理所当然。