【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #

简介: 【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #
  • 坚持不一定会有效果,但一定会有意义。文章目录
  • 本章题目的难易程度为:简单。


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


一件事只要你坚持得足够久, “坚持”就会慢慢变成“习惯”。 原本需要费力去驱动的事情就成了家常便饭, 原本下定决心才能开始的事情也变得理所当然。


相关文章
|
3月前
|
自然语言处理 Rust 算法
【算法】13. 罗马数字转整数(多语言实现)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 | 字符 | 数值 | |--|--| | I | 1 | | V | 5 | | X | 10 | | L | 50 | | C | 100 | | D | 500 | | M | 1000 | 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1
【算法】13. 罗马数字转整数(多语言实现)
|
2月前
|
算法 Java
[Java·算法·简单] LeetCode 13. 罗马数字转整数 详细解读
[Java·算法·简单] LeetCode 13. 罗马数字转整数 详细解读
23 0
|
4月前
|
算法 测试技术 C#
【数位dp】【C++算法】600. 不含连续1的非负整数
【数位dp】【C++算法】600. 不含连续1的非负整数
|
4月前
|
算法 Java C++
试题 算法训练 整数拆分
试题 算法训练 整数拆分
24 0
|
2月前
|
算法
算法题 — 整数转二进制,查找其中1的数量
算法题 — 整数转二进制,查找其中1的数量
12 0
|
3月前
|
算法 测试技术 C++
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
|
3月前
|
算法 测试技术 C++
【数位dp】【C++算法】600. 不含连续1的非负整数
【数位dp】【C++算法】600. 不含连续1的非负整数
|
3月前
|
算法 C语言
C语言数组实例(冒泡算法、猜数字)
C语言数组实例(冒泡算法、猜数字)
17 0
|
3月前
|
算法
算法基础——整数二分查找(二)
算法基础——整数二分查找(二)
29 0
算法基础——整数二分查找(二)
|
4月前
|
算法 测试技术 C#
【滑动窗口】C++算法:K 个不同整数的子数组
【滑动窗口】C++算法:K 个不同整数的子数组