百度3.29笔试算法题
题型:单选 + 多选 + 算法
(1) 乘法表的最大值
给出一个乘法表,现在有一个新的乘法表规则,输入 n 和 k, 取第 n 行中的前k个乘积反转的最大值(有点绕 直接看用例好理解一些)
例子:n = 8, k = 9 数据范围:(1 <= n, k <= 1000)
解释:第n行前k个数字的正常情况下的乘积为:
8, 16, 24, 32, 40, 48, 56, 64, 72
反转后的乘积
8, 61, 42, 23, 4, 84, 65, 46, 27
取反转后结果的最大值: 84
代码:(100%)
let input = readline(), n = +input[0], k = +input[1]
let calcReverseMaxNum = function (n, k) {
let max = 0
for (let i = 1; i < k; i++) {
if(i * n < 10) {
max = Math.max(max, i * n)
continue
}
let val = i * n + ""
let ret = parseInt(Array.from(val).reverse().join(""))
max = Math.max(max, ret)
}
return max
} (2)找数对
给出一个t个N,实现f函数,找出符合条件数对数量, 就是说从N中找两个数(A 和 B),使得A * B == N, gcd(A,B) == 1
gcd(A, B) = 1
lcm(A, B) = A * B
例子:
输入:30
返回: 4
解释: 可以构成的数对为:(1, 30), (5, 6), (15, 2), (3, 10)
去重: 因为(1,30)数对已经有了, 就不能有(30, 1)了,后面同理
代码(100%)
let t = parseInt(readline()), line, arr = []
while (line = parseInt(readline())) arr.push(line)
// // 求最大公约数
let gcd = (a, b) => b ? gcd(b, a % b) : a;
let f = function (nums) {
for (let i = 0; i < t; i++) {
let k = Math.sqrt(nums[i]) // 只需要取一半就行,不然后面都是重复的计算会超时
let ans = 0
for (let j = 1; j < k; j++) {
let a = nums[i] / j
if (nums[i] % j == 0 && gcd(a, j) == 1) ans++
}
console.log(ans)
}
}
f(arr) (3)构造完美数
给出一个数,只包含1, 2, 3的数字称为完美数,如果当前数字不符合完美数的要求,那么返回可以构造的最大的不超过当前数字的完美数。
例子:1. 输入 213 => 返回 213
2. 输入 2244 => 返回 2233
3. 输入 3355 => 返回 3333
4. 输入 100 => 返回 33
代码(用贪心没做出来,自己输入一些测试用例都能过,提交过不了)
let n = parseInt(readline())
let line, arr = []
while (line = readline()) arr.push(parseInt(line))
let f = function (nums) {
for (let i = 0; i < n; i++) {
if (nums[i] <= 3 && nums[i] >= 1) {
console.log(nums[i])
continue
}
let num = "", curr = nums[i] + "", j = 0, len = curr.length, flag = false
while (j < len) {
if (flag) {
num += 3;
j++
continue;
}
if (curr[j] > 3 || curr[j] == 0) {
num += 3;
flag = true
} else if (curr[j] >= 1 && curr[j] <= 3) {
num += curr[j];
}
j++
}
let val = parseInt(num)
console.log(val > curr ? parseInt('3'.repeat(len - 1)) : val)
}
}
f(arr)