刷题34(牛客1道题+力扣2道题)

62.不用做任何比较判断运算符找出两个整数中的较大的值

题目链接

https://www.nowcoder.com/practice/02ae5ccb63064bbdb2366417d8b70ff3?tpId=101&&tqId=33211&rp=5&ru=/activity/oj&qru=/ta/programmer-code-interview-guide/question-ranking

题目描述

给定两个32位整数a和b,返回a和b中较大的,要求不能用任何比较判断运算符。

输入描述:

输出两个整数a和b,a和b均为32位整数。

输出描述:

输出一个整数,两个数中较大的那一个。
示例1

输入

1 0

输出

1

备注:

时间复杂度O(1)O(1),额外空间复杂度O(1)O(1)。

重难点

sort排序

题目分析

  1. 获取整数a,b;
  2. 使用sort函数排序,比较数值大小;
  3. 输出较大的数:下标为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排序

题目分析

  1. 把nums赋值给新的数组:res = [].concat(nums);
  2. 用sort给数值排序,排序后,每个数字对应的下标就是比此数字小的个数。
  3. 在排序后的数组中按顺序找到原数组nums数字的下标;
  4. 按顺序输出下标。
/**
 * @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 }, () => 值)

题目分析

  1. 使用0初始化数组:Array.from(Array(num_people), () => 0);
  2. 用num记录每次给多少糖;
  3. 判断按照num分糖果,剩余的糖果是否>0,若是>0,接着给每位小朋友分num块糖;
  4. 若<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;
};

  

猜你喜欢

转载自www.cnblogs.com/liu-xin1995/p/12417246.html