笨阶乘
笨阶乘
通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积。例如,factorial(10) = 10 _ 9 _ 8 _ 7 _ 6 _ 5 _ 4 _ 3 _ 2 _ 1。相反,我们设计了一个笨阶乘 clumsy:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(_),除法(/),加法(+)和减法(-)。例如,clumsy(10) = 10 _ 9 / 8 + 7 - 6 _ 5 / 4 + 3 - 2 _ 1。然而,这些运算仍然使用通常的算术运算顺序:我们在任何加、减步骤之前执行所有的乘法和除法步骤,并且按从左到右处理乘法和除法步骤。另外,我们使用的除法是地板除法(floor division),所以 10 _ 9 / 8 等于 11。这保证结果是一个整数。实现上面定义的笨函数:给定一个整数 N,它返回 N 的笨阶乘。
输入:4
输出:7
解释:7 = 4 * 3 / 2 + 1
输入:10
输出:12
解释:12 = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1
12345678910 ...
元素计数
元素计数
给你一个整数数组 nums ,统计并返回在 nums 中同时至少具有一个严格较小元素和一个严格较大元素的元素数目。
输入:nums = [11,7,2,15]
输出:2
解释:元素 7 :严格较小元素是元素 2 ,严格较大元素是元素 11 。
元素 11 :严格较小元素是元素 7 ,严格较大元素是元素 15 。总计有 2 个元素都满足在 nums 中同时存在一个严格较小元素和一个严格较大元素。
输入:nums = [-3,3,3,90]
输出:2
解释:元素 3 :严格较小元素是元素 -3 ,严格较大元素是元素 90 。由于有两个元素的值为 3 ,总计有 2 个元素都满足在 nums 中同时存在一个严格较小元素和一个严格较大元素。
123456789101112var countElements = function(nums) { nums.sort((a, b) => a - b) // return nums let min = nums[0], max = nums[nums.length - 1] let ...
按奇偶排序数组 II
按奇偶排序数组 II
给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。你可以返回 任何满足上述条件的数组作为答案 。
输入:nums = [4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。
输入:nums = [2,3]
输出:[2,3]
123456789101112131415161718192021var sortArrayByParityII = function(nums) { const n = nums.length; const ans = new Array(n); let i = 0; for (const x of nums) { if (!(x & 1)) { ans[i] = x; i += 2; ...
数组的相对排序
数组的相对排序
给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]
输入:arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6]
输出:[22,28,8,6,17,44]
1234567891011121314151617181920212223242526272829var relativeSortArray = function(arr1, arr2) { // 转换成次数表达的数组 // arr1 === [1,1,1,2,2,3] // repo === [,3,2,1] const repo = [] ar ...
回文质数
回文质数
给你一个整数 n ,返回大于或等于 n 的最小回文质数。一个整数如果恰好有两个除数:1 和它本身,那么它是 质数 。注意,1 不是质数。例如,2、3、5、7、11 和 13 都是质数。一个整数如果从左向右读和从右向左读是相同的,那么它是 回文数 。例如,101 和 12321 都是回文数。测试用例保证答案总是存在,并且在 [2, 2 * 108] 范围内。
输入:n = 6
输出:7
输入:n = 8
输出:11
12345678910111213141516171819202122232425262728293031323334var primePalindrome = function(N) { if(N == 1) return 2 //判断素数 var su = function(num){ for(var i = 2; i<=Math.sqrt(num); i++){ if(num % i == 0){ return fal ...
数组序号转换
数组序号转换
给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。序号代表了一个元素有多大。序号编号的规则如下:序号从 1 开始编号。一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。每个数字的序号都应该尽可能地小。
输入:arr = [40,10,20,30]
输出:[4,1,2,3]
解释:40 是最大的元素。 10 是最小的元素。 20 是第二小的数字。 30 是第三小的数字。
输入:arr = [100,100,100]
输出:[1,1,1]
解释:所有元素有相同的序号。
输入:arr = [37,12,28,9,100,56,80,5,12]
输出:[5,3,4,2,8,6,7,1,3]
12345var arrayRankTransform = function(arr) { const sortArr = [...new Set(arr)].sort((a, b) => a - b); const hash = new Map(sortArr.map((v, i) => [v, ...
有效的回旋镖
有效的回旋镖
给定一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点,如果这些点构成一个 回旋镖 则返回 true 。回旋镖 定义为一组三个点,这些点 各不相同 且 不在一条直线上 。
输入:points = [[1,1],[2,3],[3,2]]
输出:true
输入:points = [[1,1],[2,2],[3,3]]
输出:false
12345678910111213141516171819var isBoomerang = function(points) { let p1 = points[0].join(','); let p2 = points[1].join(','); let p3 = points[2].join(','); if (p1 === p2 || p2 === p3 || p1 === p3) { return false; } function ...
石子游戏
石子游戏
Alice 和 Bob 用几堆石子在做游戏。一共有偶数堆石子,排成一行;每堆都有 正 整数颗石子,数目为 piles[i] 。游戏以谁手中的石子最多来决出胜负。石子的 总数 是 奇数 ,所以没有平局。Alice 和 Bob 轮流进行,Alice 先开始 。 每回合,玩家从行的 开始 或 结束 处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中 石子最多 的玩家 获胜 。假设 Alice 和 Bob 都发挥出最佳水平,当 Alice 赢得比赛时返回 true ,当 Bob 赢得比赛时返回 false 。
输入:piles = [5,3,4,5]
输出:true
解释:Alice 先开始,只能拿前 5 颗或后 5 颗石子 。假设他取了前 5 颗,这一行就变成了 [3,4,5] 。如果 Bob 拿走前 3 颗,那么剩下的是 [4,5],Alice 拿走后 5 颗赢得 10 分。如果 Bob 拿走后 5 颗,那么剩下的是 [3,4],Alice 拿走后 4 颗赢得 9 分。这表明,取前 5 颗石子对 Alice 来说是一个胜利的举动,所以返回 true 。
12 ...
相对名次
相对名次
给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况:名次第 1 的运动员获金牌 “Gold Medal” 。名次第 2 的运动员获银牌 “Silver Medal” 。名次第 3 的运动员获铜牌 “Bronze Medal” 。从名次第 4 到第 n 的运动员,只能获得他们的名次编号(即,名次第 x 的运动员获得编号 “x”)。使用长度为 n 的数组 answer 返回获奖,其中 answer[i] 是第 i 位运动员的获奖情况。
输入:score = [5,4,3,2,1]
输出:[“Gold Medal”,”Silver Medal”,”Bronze Medal”,”4”,”5”]
解释:名次为 [1st, 2nd, 3rd, 4th, 5th] 。
输入:score = [10,3,8,9,4]
输出:[“Gold Medal”,”5”,”B ...
分汤
分汤
有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作:提供 100ml 的 汤 A 和 0ml 的 汤 B 。提供 75ml 的 汤 A 和 25ml 的 汤 B 。提供 50ml 的 汤 A 和 50ml 的 汤 B 。提供 25ml 的 汤 A 和 75ml 的 汤 B 。当我们把汤分配给某人之后,汤就没有了。每个回合,我们将从四种概率同为 0.25 的操作中进行分配选择。如果汤的剩余量不足以完成某次操作,我们将尽可能分配。当两种类型的汤都分配完时,停止操作。注意 不存在先分配 100 ml 汤 B 的操作。需要返回的值: 汤 A 先分配完的概率 + 汤 A 和汤 B 同时分配完的概率 / 2。返回值在正确答案 10-5 的范围内将被认为是正确的。
输入: n = 50
输出: 0.62500
解释:如果我们选择前两个操作,A 首先将变为空。对于第三个操作,A 和 B 会同时变为空。对于第四个操作,B 首先将变为空。所以 A 变为空的总概率加上 A 和 B 同时变为空的概率的一半是 0.25 *(1 + 1 + 0.5 + 0)= 0.625。- ...