刷题34(牛客1道题+力扣2道题)
62.不用做任何比较判断运算符找出两个整数中的较大的值
题目链接
题目描述
输入描述:
输出两个整数a和b,a和b均为32位整数。
输出描述:
输出一个整数,两个数中较大的那一个。
输入
1 0
输出
1
备注:
时间复杂度O(1)O(1),额外空间复杂度O(1)O(1)。
重难点
sort排序
题目分析
- 获取整数a,b;
- 使用sort函数排序,比较数值大小;
- 输出较大的数:下标为1的数。
var input = readline().split(' '); var num = []; num[0] = parseInt(input[0]); num[1] = parseInt(input[1]); num.sort(function(a,b){ return a-b; }); print(num[1]);
63.1365. 有多少小于当前数字的数字
题目来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number
题目描述
给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。
以数组形式返回答案。
示例 1
输入:nums = [8,1,2,2,3]
输出:[4,0,1,1,3]
解释:
对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。
对于 nums[1]=1 不存在比它小的数字。
对于 nums[2]=2 存在一个比它小的数字:(1)。
对于 nums[3]=2 存在一个比它小的数字:(1)。
对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。
示例 2
输入:nums = [6,5,4,8]
输出:[2,1,0,3]
示例 3
输入:nums = [7,7,7,7]
输出:[0,0,0,0]
提示:
2 <= nums.length <= 500
0 <= nums[i] <= 100
关键技术
sort排序
题目分析
- 把nums赋值给新的数组:res = [].concat(nums);
- 用sort给数值排序,排序后,每个数字对应的下标就是比此数字小的个数。
- 在排序后的数组中按顺序找到原数组nums数字的下标;
- 按顺序输出下标。
/** * @param {number[]} nums * @return {number[]} */ var smallerNumbersThanCurrent = function(nums) { var res = [].concat(nums); //把nums赋值给新的数组 res.sort(function(a,b){ return a-b; }); var index = []; for(let i=0;i<nums.length;i++){ for(let j=0;j<nums.length;j++){ if(nums[i] == res[j]){ index.push(j); break; } } } return index; };
64 .1103. 分糖果 II
题目来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/distribute-candies-to-people
题目描述
排排坐,分糖果。
我们买了一些糖果 candies,打算把它们分给排好队的 n = num_people 个小朋友。
给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友 n 颗糖果。
然后,我们再回到队伍的起点,给第一个小朋友 n + 1 颗糖果,第二个小朋友 n + 2 颗,依此类推,直到给最后一个小朋友 2 * n 颗糖果。
重复上述过程(每次都比上一次多给出一颗糖果,当到达队伍终点后再次从队伍起点开始),直到我们分完所有的糖果。注意,就算我们手中的剩下糖果数不够(不比前一次发出的糖果多),这些糖果也会全部发给当前的小朋友。
返回一个长度为 num_people、元素之和为 candies 的数组,以表示糖果的最终分发情况(即 ans[i] 表示第 i 个小朋友分到的糖果数)。
示例1
输入:candies = 7, num_people = 4
输出:[1,2,3,1]
解释:
第一次,ans[0] += 1,数组变为 [1,0,0,0]。
第二次,ans[1] += 2,数组变为 [1,2,0,0]。
第三次,ans[2] += 3,数组变为 [1,2,3,0]。
第四次,ans[3] += 1(因为此时只剩下 1 颗糖果),最终数组变为 [1,2,3,1]。
示例2
输入:candies = 10, num_people = 3
输出:[5,2,3]
解释:
第一次,ans[0] += 1,数组变为 [1,0,0]。
第二次,ans[1] += 2,数组变为 [1,2,0]。
第三次,ans[2] += 3,数组变为 [1,2,3]。
第四次,ans[0] += 4,最终数组变为 [5,2,3]。
提示:
1 <= candies <= 10^9
1 <= num_people <= 1000
重难点
使用相同的值初始化数组:Array.from({ length }, () => 值)
题目分析
- 使用0初始化数组:Array.from(Array(num_people), () => 0);
- 用num记录每次给多少糖;
- 判断按照num分糖果,剩余的糖果是否>0,若是>0,接着给每位小朋友分num块糖;
- 若<0,把未按照num分之前剩余的糖果都给这位小朋友,并把糖果总数赋为0。
/** * @param {number} candies * @param {number} num_people * @return {number[]} */ var distributeCandies = function(candies, num_people) { const res = Array.from(Array(num_people), () => 0); //使用0来初始化数组 let num = 0; while(candies){ for(let i=0;i<num_people;i++){ num++; if(candies - num > 0){ res[i] += num; candies -= num; } else{ res[i] += candies; candies = 0; break; } } } return res; };