【C语言刷题——Leetcode12道题】带你起飞,飞进垃圾堆

✨作者:@平凡的人1

✨专栏:《小菜鸟爱刷题》

✨一句话:凡是过往,皆为序章

✨说明: 过去无可挽回, 未来可以改变


🌹刷题系列,欢迎来访C语言经典题目


刷题之——Leetcode12道简单题,通过这12道简单题,让你对Leetcode有所新的理解,增强自己的做题能力。

下面,直接进入我们的题目。👇

260.只出现一次的数字III(难度:中等)

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

示例 1:

输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。
示例 2:

输入:nums = [-1,0]
输出:[-1,0]
示例 3:

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

来源:力扣(LeetCode)

这道题Leetcode难度归类为中等,但是我感觉我们撑一撑应该还是能做得出来的(bushi):

这里的变量为了方便说明就使用我做题过程中命名的名字了🌹

解题思路:首先,我们定义一个变量(eor)初始化为0去遍历按位异或数组中的所有元素,此时得到的是只出现一次的两个元素的二进制异或结果。然后去对二进制的结果进行处理:对于两个不同的数字,异或出来的二进制结果中为1的话说明了:在该二进制位上的数字是不同的(我们可以定义一个变量rightone去找出此时二进制结果中最右边位1的位置,至于怎么找等下直接看代码即可,这里不展开说明了)。基于此,我们在把数组的元素分为两类:一类是在该二进制位相同的元素,另一类是在该二进制位不同的元素。然后在遍历一次数组,&按位与rightone找出其中的一个数onlyone,至于另外一个数直接根据第一次两数异或的结果eor在异或上onlyone即可得出。

下面,看看我们的代码:

image-20220623215907950

(温馨提示:这里的变量如果定义为int类型的话,会出现溢出的错误,不要问我为什么知道,因为一开始自己的就是int类型,所以改为long类型较为合适)😶

下面进行提交运行:

image-20220624104350747

728.自除数

自除数 是指可以被它包含的每一位数整除的数。

例如,128 是一个 自除数 ,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。
自除数 不允许包含 0 。

给定两个整数 left 和 right ,返回一个列表,列表的元素是范围 [left, right] 内所有的 自除数 。

示例 1:

输入:left = 1, right = 22
输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
示例 2:

输入:left = 47, right = 85
输出:[48,55,66,77]

来源:力扣(LeetCode)

这道题怎么说呢,关键在于把一个数中的每一位找出来,看看是否整除即可。为了方便,可以封装一个函数来进行处理:

image-20220624105250947

image-20220624105324401

==本菜鸟的就是这种做法emm,至于大佬==的我就不知道了

922.按奇偶排序数组 II

给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。

对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。

你可以返回 任何满足上述条件的数组作为答案 。

示例 1:

输入:nums = [4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。
示例 2:

输入:nums = [2,3]
输出:[2,3]

来源:力扣(LeetCode)

把数组中一半的奇数找出来,另一半的偶数找出来,下标稍微处理一下即可解决问题:

image-20220624105626164

image-20220624105638090

976. 三角形的最大周长

给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。

示例 1:

输入:nums = [2,1,2]
输出:5
示例 2:

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

来源:力扣(LeetCode)

解题思路:把数组排个序,找出3个最大的元素,判断是否能够构成三角形即可

image-20220624105831642

1287. 有序数组中出现次数超过25%的元素

给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。

请你找到并返回这个整数

示例:

输入:arr = [1,2,2,6,6,6,6,7,10]
输出:6

来源:力扣(LeetCode)

字面意思,直接做题即可:

image-20220624110134298

1351. 统计有序矩阵中的负数

给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目。

示例 1:

输入:grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]
输出:8
解释:矩阵中共有 8 个负数。
示例 2:

输入:grid = [[3,2],[1,0]]
输出:0

来源:力扣(LeetCode)

遍历走你😄

image-20220624110314701

1903. 字符串中的最大奇数

给你一个字符串 num ,表示一个大整数。请你在字符串 num 的所有 非空子字符串 中找出 值最大的奇数 ,并以字符串形式返回。如果不存在奇数,则返回一个空字符串 “” 。

子字符串 是字符串中的一个连续的字符序列。

示例 1:

输入:num = “52”
输出:“5”
解释:非空子字符串仅有 “5”、“2” 和 “52” 。“5” 是其中唯一的奇数。
示例 2:

输入:num = “4206”
输出:“”
解释:在 “4206” 中不存在奇数。
示例 3:

输入:num = “35427”
输出:“35427”
解释:“35427” 本身就是一个奇数。

来源:力扣(LeetCode)

从后往前遍历更加方便只要最后的一位(相对而言,当前的最后一位)出现奇数说明这个数就是奇数了>,下面直接上手代码:

image-20220624110638527

1979. 找出数组的最大公约数

给你一个整数数组 nums ,返回数组中最大数和最小数的 最大公约数 。

两个数的 最大公约数 是能够被两个数整除的最大正整数。

示例 1:

输入:nums = [2,5,6,9,10]
输出:2
解释:
nums 中最小的数是 2
nums 中最大的数是 10
2 和 10 的最大公约数是 2
示例 2:

输入:nums = [7,5,6,8,3]
输出:1
解释:
nums 中最小的数是 3
nums 中最大的数是 8
3 和 8 的最大公约数是 1
示例 3:

输入:nums = [3,3]
输出:3
解释:
nums 中最小的数是 3
nums 中最大的数是 3
3 和 3 的最大公约数是 3

来源:力扣(LeetCode)

解题思路:将数组排完序之后,第一位就是最小元素,最后一维就是最大元素,接下来就是求最大公约数了(直接辗转相除法即可)

image-20220624110907792

2089. 找出数组排序后的目标下标

给你一个下标从 0 开始的整数数组 nums 以及一个目标元素 target 。

目标下标 是一个满足 nums[i] == target 的下标 i 。

将 nums 按 非递减 顺序排序后,返回由 nums 中目标下标组成的列表。如果不存在目标下标,返回一个 空 列表。返回的列表必须按 递增 顺序排列。

示例 1:

输入:nums = [1,2,5,2,3], target = 2
输出:[1,2]
解释:排序后,nums 变为 [1,2,2,3,5] 。
满足 nums[i] == 2 的下标是 1 和 2 。
示例 2:

输入:nums = [1,2,5,2,3], target = 3
输出:[3]
解释:排序后,nums 变为 [1,2,2,3,5] 。
满足 nums[i] == 3 的下标是 3 。
示例 3:

输入:nums = [1,2,5,2,3], target = 5
输出:[4]
解释:排序后,nums 变为 [1,2,2,3,5] 。
满足 nums[i] == 5 的下标是 4 。
示例 4:

输入:nums = [1,2,5,2,3], target = 4
输出:[]
解释:nums 中不含值为 4 的元素。

来源:力扣(LeetCode)

将 nums 按 非递减 顺序排序后,这句话说明了需要我们先去排序,数组本来是无序的,后面进行遍历查找即可:

image-20220624111329201

提交运行:

image-20220624111345072

2124. 检查是否所有 A 都在 B 之前

给你一个 仅 由字符 ‘a’ 和 ‘b’ 组成的字符串 s 。如果字符串中 每个 ‘a’ 都出现在 每个 ‘b’ 之前,返回 true ;否则,返回 false 。

示例 1:

输入:s = “aaabbb”
输出:true
解释:
‘a’ 位于下标 0、1 和 2 ;而 ‘b’ 位于下标 3、4 和 5 。
因此,每个 ‘a’ 都出现在每个 ‘b’ 之前,所以返回 true 。
示例 2:

输入:s = “abab”
输出:false
解释:
存在一个 ‘a’ 位于下标 2 ,而一个 ‘b’ 位于下标 1 。
因此,不能满足每个 ‘a’ 都出现在每个 ‘b’ 之前,所以返回 false 。
示例 3:

输入:s = “bbb”
输出:true
解释:
不存在 ‘a’ ,因此可以视作每个 ‘a’ 都出现在每个 ‘b’ 之前,所以返回 true 。

来源:力扣(LeetCode)

解题思路:a是否都在b之前,所以我们定义两个变量,一个为0作为判断b的下标,另一个为1作为判断a的下标,直接去比较即可

image-20220624111626591

2180. 统计各位数字之和为偶数的整数个数

给你一个正整数 num ,请你统计并返回 小于或等于 num 且各位数字之和为 偶数 的正整数的数目。

正整数的 各位数字之和 是其所有位上的对应数字相加的结果。

示例 1:

输入:num = 4
输出:2
解释:
只有 2 和 4 满足小于等于 4 且各位数字之和为偶数。
示例 2:

输入:num = 30
输出:14
解释:
只有 14 个整数满足小于等于 30 且各位数字之和为偶数,分别是:
2、4、6、8、11、13、15、17、19、20、22、24、26 和 28 。

来源:力扣(LeetCode)

找出各位数字之和为 偶数 的正整数即可,封装成一个函数方便操作:

image-20220624111832673

2278. 字母在字符串中的百分比

给你一个字符串 s 和一个字符 letter ,返回在 s 中等于 letter 字符所占的 百分比 ,向下取整到最接近的百分比。

示例 1:

输入:s = “foobar”, letter = “o”
输出:33
解释:
等于字母 ‘o’ 的字符在 s 中占到的百分比是 2 / 6 * 100% = 33% ,向下取整,所以返回 33 。
示例 2:

输入:s = “jjjj”, letter = “k”
输出:0
解释:
等于字母 ‘k’ 的字符在 s 中占到的百分比是 0% ,所以返回 0 。

来源:力扣(LeetCode)

没啥好说的,遍历就完事了

image-20220624111948945

总结

博主能力有限。可能一些题有更优的做法,不过目前博主是个菜鸟,能做出来就ok了。同时,我们也应该多去总结一下,方便自己的复习的同时,也分享自己的学习过程,这样也挺不错的呀。这次就先到这里结束了,感谢游览🌹

  • 79
    点赞
  • 212
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 65
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 65
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

平凡的人1

佬的鼓励是我创作的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值