刷题笔记(第八天)

1. 请补全JavaScript代码,实现一个函数,要求如下:
  • 根据输入的数字范围[start,end]和随机数个数"n"生成随机数
  • 生成的随机数存储到数组中,返回该数组
  • 返回的数组不能有相同元素
    注意: 不需要考虑"n"大于数字范围的情况
    输入:getUniqueNums(2,10,4)
    输出:[4,6,2,8]
javascript 复制代码
const _getUniqueNums = (start,end,n) => {
    let a = [];
    let count = 0;
    while (count < n) {
      let x = Math.floor(Math.random() * (end - start) + start)
      if (a.indexOf(x) === -1) {
        a.push(x);
        count++;
      }
     }
    return a;
}

解题思路:Math.random()*(end-start)+start生成指定范围内的随机数 并且使用Math.floor()转化为整数,判断该数字是否存在于数组中,不存在则将该数字存为数组,直到数组长度为n。

2. 两数相加给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

  • 输入:l1 = [2,4,3], l2 = [5,6,4]
  • 输出:[7,0,8]
  • 解释:342 + 465 = 807.

解题思路:l1l2两个链表同时从头结点遍历取值,相加,如果两数相加大于0,下一个要相加的数要注意进位,计算得到一个数、便存入链表中,最后将

javascript 复制代码
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
var addTwoNumbers = function (l1, l2) {
   let node = new ListNode('0');
   let head = node;
   let add = 0;
   while(l1 || l2 || add) {
       let a = l1===null ? 0 : l1.val;
       let b = l2===null ? 0 : l2.val;
       let s = a + b + add;
       add = s >=10 ? 1 : 0;
       node.next = new ListNode(s % 10);
       node = node.next;
       if (l1) l1=l1.next;
       if (l2) l2=l2.next;
   }
   return head.next;
};
3. 整数反转:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。

输入:x = 123 输出:321

输入:x = -123 输出:-321

输入:x = 120 输出:21

javascript 复制代码
/**
 * @param {number} x
 * @return {number}
 */
var reverse = function (x) {
      let sum = 0;
      let max = Math.pow(2, 31) - 1, min = -max - 1;
      if (x < min || x > max) {
        return 0;
      }
      while (x != 0) {
        let a = x % 10;
        x = parseInt(x / 10);
        sum = sum * 10 + a;
      }
      if(sum > max || sum < min) {
          return 0;
      }
      return sum;
 };
4. 盛水最多的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

javascript 复制代码
/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
    let left=0;
    let right=height.length-1;
    let maxArea=0;
    while(left<right) {
        let currentArea=(right-left)*Math.min(height[left],height[right]);
        maxArea = maxArea > currentArea ? maxArea : currentArea;
        if (height[left]<height[right]) {
            left++;
        } else {
            right--;
        }
    }
    return maxArea;
};
5. 整数转罗马数字

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  1. I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  2. X 可以放在 L (50) 和 C (100) 的左边,来表示40 和 90。
  3. C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
    给你一个整数,将其转为罗马数字。
  • 示例1
    • 输入: num = 3
    • 输出: "III"
  • 示例2
    • 输入: num = 4
    • 输出: "IV"
javascript 复制代码
/**
 * @param {number} num
 * @return {string}
 */
var intToRoman = function(num) {
    let qian = ['','M','MM','MMM']; // 分别表示0,一千、两千、三千 (1<=num<=3999) 
    let bai = ['','C','CC','CCC','CD','D','DC','DCC','DCCC','CM'];
    let shi = ['','X','XX','XXX','XL','L','LX','LXX','LXXX','XC'];
    let ge = ['','I','II','III','IV','V','VI','VII','VIII','IX'];
    let q = Math.floor(num/1000);
    let b = Math.floor(num/100%10);
    let s = Math.floor(num/10%10);
    let g = Math.floor(num%10);
    return qian[q] + bai[b] + shi[s] + ge[g];
};
6. 罗马数字转整数
  • 示例1
    • 输入: s = "III"
    • 输出: 3
  • 示例 2:
    • 输入: s = "IV"
    • 输出: 4
  • 示例 3:
    • 输入: s = "IX"
    • 输出: 9
javascript 复制代码
/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(s) {
    let m=new Map([['I',1],['V',5],['X',10],['L',50],['C',100],['D',500],['M',1000]]);
    let res=0;
    for(let i=0;i<s.length;i++) {
        let left=m.get(s[i]);
        let right=m.get(s[i+1]);
        res+=left<right?-left:left;
    }
    return res;
};
相关推荐
Yawesh_best13 小时前
告别系统壁垒!WSL+cpolar 让跨平台开发效率翻倍
运维·服务器·数据库·笔记·web安全
Ccjf酷儿15 小时前
操作系统 蒋炎岩 3.硬件视角的操作系统
笔记
习习.y16 小时前
python笔记梳理以及一些题目整理
开发语言·笔记·python
在逃热干面16 小时前
(笔记)自定义 systemd 服务
笔记
DKPT18 小时前
ZGC和G1收集器相比哪个更好?
java·jvm·笔记·学习·spring
QT 小鲜肉19 小时前
【孙子兵法之上篇】001. 孙子兵法·计篇
笔记·读书·孙子兵法
星轨初途20 小时前
数据结构排序算法详解(5)——非比较函数:计数排序(鸽巢原理)及排序算法复杂度和稳定性分析
c语言·开发语言·数据结构·经验分享·笔记·算法·排序算法
QT 小鲜肉20 小时前
【孙子兵法之上篇】001. 孙子兵法·计篇深度解析与现代应用
笔记·读书·孙子兵法
love530love1 天前
【笔记】ComfUI RIFEInterpolation 节点缺失问题(cupy CUDA 安装)解决方案
人工智能·windows·笔记·python·插件·comfyui
愚戏师1 天前
MySQL 数据导出
数据库·笔记·mysql