1. 請補全JavaScript代碼,實現一個函數,要求如下:
- 根據輸入的數字范圍[start,end]和隨機數個數"n"生成隨機數
- 生成的隨機數存儲到數組中,返回該數組
- 返回的數組不能有相同元素
注意: 不需要考慮"n"大于數字范圍的情況
輸入:getUniqueNums(2,10,4)
輸出:[4,6,2,8]
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.
解題思路:l1
和l2
兩個鏈表同時從頭結點遍歷取值,相加,如果兩數相加大于0
,下一個要相加的數要注意進位
,計算得到一個數、便存入鏈表中,最后將
/*** 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
/*** @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 軸共同構成的容器可以容納最多的水。返回容器可以儲存的最大水量。
/*** @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。這個特殊的規則只適用于以下六種情況:
- I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
- X 可以放在 L (50) 和 C (100) 的左邊,來表示40 和 90。
- C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。
給你一個整數,將其轉為羅馬數字。
- 示例1
- 輸入: num = 3
- 輸出: “III”
- 示例2
- 輸入: num = 4
- 輸出: “IV”
/*** @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
/*** @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;
};