拆分数位后四位数字的最小和
拆分数位后四位数字的最小和
给你一个四位 正 整数 num 。请你使用 num 中的 数位 ,将 num 拆成两个新的整数 new1 和 new2 。new1 和 new2 中可以有 前导 0 ,且 num 中 所有 数位都必须使用。比方说,给你 num = 2932 ,你拥有的数位包括:两个 2 ,一个 9 和一个 3 。一些可能的 [new1, new2] 数对为 [22, 93],[23, 92],[223, 9] 和 [2, 329] 。请你返回可以得到的 new1 和 new2 的 最小 和。
输入:num = 2932
输出:52解释:可行的 [new1, new2] 数对为 [29, 23] ,[223, 9] 等等。最小和为数对 [29, 23] 的和:29 + 23 = 52 。
12345678var minimumSum = function(num) { let arr = (num + '').split('').map(Number) arr.sort((a, b) => a - b) ...
跳水板
跳水板
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为 shorter,长度较长的木板长度为 longer。你必须正好使用 k 块木板。编写一个方法,生成跳水板所有可能的长度。返回的长度需要从小到大排列。
输入:shorter = 1longer = 2k = 3
输出: [3,4,5,6]解释:可以使用 3 次 shorter,得到结果 3;使用 2 次 shorter 和 1 次 longer,得到结果 4 。以此类推,得到最终结果。
123456789var divingBoard = function(shorter, longer, k) { if (k == 0) return []; if (shorter == longer) return [k * shorter]; const res = []; for (let i = 0; i <= k; i++) { res.push(i * longer + (k - i) * shorter); // 题目好像从短到长排列,那就从0个longer开始 ...
硬币
硬币
硬币。给定数量不限的硬币,币值为 25 分、10 分、5 分和 1 分,编写代码计算 n 分有几种表示法。(结果可能会很大,你需要将结果模上 1000000007)
输入: n = 5
输出:2解释: 有两种方式可以凑成总金额:5=55=1+1+1+1+1
输入: n = 10
输出:4解释: 有四种方式可以凑成总金额:10=1010=5+510=5+1+1+1+1+110=1+1+1+1+1+1+1+1+1+1
12345678910var waysToChange = function(n) { let mod = 1e9+7 let res = 0 for(let i=0; i<= ~~(n/25);i++){ let a = ~~((n-i*25)/10) let t = (a+1)*(~~(n/5)-5*i-a+1) res = (res+t)%mod } return res};
交换数字
交换数字
编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值。
输入: numbers = [1,2]
输出: [2,1]
123456var swapNumbers = function(numbers) { numbers[0]=numbers[0]^numbers[1] numbers[1]=numbers[0]^numbers[1] numbers[0]=numbers[0]^numbers[1] return numbers};
合并排序的数组
合并排序的数组
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。初始化 A 和 B 的元素数量分别为 m 和 n。
输入:A = [1,2,3,0,0,0], m = 3B = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
12345var merge = function(A, m, B, n) { while(n){ A[m+n-1] = !m||A[m-1]<=B[n-1]?B[n---1]:A[m---1] }};
最佳直线
最佳直线
给定一个二维平面及平面上的 N 个点列表 Points,其中第 i 个点的坐标为 Points[i]=[Xi,Yi]。请找出一条直线,其通过的点的数目最多。设穿过最多点的直线所穿过的全部点编号从小到大排序的列表为 S,你仅需返回[S[0],S[1]]作为答案,若有多条直线穿过了相同数量的点,则选择 S[0]值较小的直线返回,S[0]相同则选择 S[1]值较小的直线返回。
输入: [[0,0],[1,1],[1,0],[2,0]]
输出: [0,2]解释: 所求直线穿过的 3 个点的编号为[0,2,3]
123456789101112131415161718192021222324252627282930313233343536var bestLine = function(points) { var inLine = function (p0, p1, p2) { return (p1[1] - p0[1]) * (p2[0] - p0[0]) == (p1[0] - p0[0]) * (p2[1] - p0[1]) ...
不用加号的加法
不用加号的加法
设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。
输入: a = 1, b = 1
输出: 2
1234567var add = function(a, b) { if(a == 0) return b if(b == 0) return a let sumA = a^b; let sumB = (a & b) << 1; return add(sumA,sumB)};
阶乘尾数
阶乘尾数
设计一个算法,算出 n 阶乘有多少个尾随零。
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
输入: 5
输出: 1解释: 5! = 120, 尾数中有 1 个零.
1234567var trailingZeroes = function(n) { let res = 0 while(n >= 5) { res += (n /= 5)|0 } return res};
最大数值
最大数值
编写一个方法,找出两个数字 a 和 b 中最大的那一个。不得使用 if-else 或其他比较运算符。
输入: a = 1, b = 2
输出: 2
1234var maximum = function(a, b) { // 两数和 + 两数差绝对值 的一半 return ((a+b)+Math.abs(a-b)) / 2};
寻找文件副本
寻找文件副本
设备中存有 n 个文件,文件 id 记于数组 documents。若文件 id 相同,则定义为该文件存在副本。请返回任一存在副本的文件 id。
输入:documents = [2, 5, 3, 0, 5, 0]
输出:0 或 5
123456789var findRepeatDocument = function(documents) { let s=new Set(); for(var i in documents){ var curLenth=s.size; s.add(documents[i]); if(s.size==curLenth) return documents[i]; }};