背景:
假设我们取一个数字 x 并执行以下任一操作:
- a:将 x 除以 3 (如果可以被 3 除)
- b:将 x 乘以 2
每次操作后,记下结果。如果从 9 开始,可以得到一个序列
有一个混杂的整数序列,现在任务是对它们重新排序,以使其符合上述序列并输出结果
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 输入: "[4,8,6,3,12,9]" 输出: [9,3,6,12,4,8]
解释: [9,3,6,12,4,8] => 9/3=3 -> 3*2=6 -> 6*2=12 -> 12/3=4 -> 4*2=8
输入: "[3000,9000]" 输出: [9000,3000]
输入: "[4,2]" 输出: [2,4]
输入: "[4,6,2]" 输出: [6,2,4]
|
人话翻译: 对数组重新排序,使得数组每一项可以满足这样一个规则:arr[i] = arr[i + 1] * 3 或者 arr[i] = arr[i + 1] / 2
解法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| function changeArr(arr) { const map = new Map(); let find = false; let ret; arr.forEach((n) => { map.set(n, (map.get(n) || 0) + 1); }); arr.forEach((n) => { if (find) return; dfs(n, 2, [n]); });
function dfs(prev, index, res) { if (find) return; if (index === arr.length + 1) { find = true; ret = res; } if (map.has(prev * 2) && map.get(prev * 2) > 0) { map.set(prev * 2, map.get(prev * 2) - 1); dfs(prev * 2, index + 1, [...res, prev * 2]); map.set(prev * 2, map.get(prev * 2) + 1); } if (!(prev % 3) && map.get(prev / 3) > 0) { map.set(prev / 3, map.get(prev / 3) - 1); dfs(prev / 3, index + 1, [...res, prev / 3]); map.set(prev / 3, map.get(prev / 3) + 1); } } return ret; }
|
来自: 2年前端,如何跟抖音面试官battle