前言
每一周都记录一下学习算法的题目以及解法
1、尾部的零
给定一个整数 n,计算出n!中尾部零的个数。
样例
输入:n = 5
输出:1
function trailingZeros(n) {
let number = 0;
while (n >= 5) {
number = number + parseInt(n / 5);
n = parseInt(n / 5);
}
return number;
}
console.log(trailingZeros(10))
2、丑数
如果一个数只有质数因子2,3,5 ,那么这个数是一个丑数。
前10个丑数分别为 1, 2, 3, 4, 5, 6, 8, 9, 10, 12…设计一个算法,找出第N个丑数。
我们可以认为 1 也是一个丑数。
样例
输入:n = 9
输出:10
function nthUglyNumber(n) {
let result = [1];
let p2 = 0;
let p3 = 0;
let p5 = 0;
for (var i = 0; i < n; i++) {
let n2 = result[p2] * 2;
let n3 = result[p3] * 3;
let n5 = result[p5] * 5;
let min = Math.min(n2, n3, n5);
result.push(min);
if (n2 === min) {
p2++;
}
if (n3 === min) {
p3++;
}
if (n5 === min) {
p5++;
}
}
return result[n - 1];
}
console.log(nthUglyNumber(5))
3、数字变形
现在题目给出一个字符串数字A。
字符串数字B是A的变形,由字符串数字A的位数交替形成。
依次为A的右数第一位数,左数第一位数,右数第二位数…以此类推,得到字符串数字B。
样例
输入: “12345678”
输出:“81726354”
function distortion(a) {
let result = ''
for (let left = 0, right = a.length - 1; left <= right; left++, right--) {
result += a.charAt(right);
if (left < right) {
result += a.charAt(left);
}
}
return result;
}
console.log(distortion('12345678'))
4、统计数字
给定一个数字 k,计算 k 在 0 到 n 中出现的次数,k 可能是 0 到 9 的一个值。
样例
输入:k=1 n=12
输出:5
function digitCounts(k, n) {
let result = []
for (let i = 0; i <= n; i++) {
result.push(i)
}
result = result.join('').split('')
return result.filter(item => Number(item) === k).length
}
console.log(digitCounts(1, 12))
5、第k大元素
在数组中找到第 k 大的元素。
样例
输入:k=3 nums = [9,3,2,4,8]
输出:4
function kthLargestElement(k, nums) {
let arr = nums.sort((a, b) => { return a - b })
return arr[arr.length - k]
}
console.log(kthLargestElement(3, [9, 3, 2, 4, 8]))
6、 旋转字符
给定一个字符 s 和一个偏移量,根据偏移量原地旋转字符数组(从左向右旋转)
样例
输入:s = “abcdefg” offset = 3
输出:“efgabcd”
输入:s = “abcdefg” offset = 10
输出:“efgabcd”
function rotateString(s, offset) {
if (offset === 0 || offset === s.length) {
return s
}
if (offset < s.length) {
return s.substr(-offset).concat(s.substr(0, s.length - offset))
}
if (offset > s.length) {
return s.substr(-(offset - s.length)).concat(s.substr(0, s.length - (offset - s.length)))
}
//另一种方法
// if (offset === 0) {
// return s
// }
// let arr = s.split('')
// for (let i = 0; i < offset; i++) {
// arr.unshift(arr.pop())
// }
// return arr.join('')
}
console.log(rotateString('abcdefg', 10))
7、Fizz Buzz问题
给定整数 n ,按照如下规则打印从 1 到 n 的每个数:
- 如果这个数被3整除,打印fizz。
- 如果这个数被5整除,打印buzz。
- 如果这个数能同时被3和5整除,打印fizz buzz。
- 如果这个数既不能被 3 整除也不能被 5 整除,打印数字本身。
样例
输入:n=15
输出:
[
“1”, “2”, “fizz”,
“4”, “buzz”, “fizz”,
“7”, “8”, “fizz”,
“buzz”, “11”, “fizz”,
“13”, “14”, “fizz buzz”
]
function fizzBuzz(n) {
const result = []
for (let i = 1; i <= n; i++) {
if (i % 15 === 0) result.push('fizz buzz')
else if (i % 5 === 0) result.push('buzz')
else if (i % 3 === 0) result.push('fizz')
else result.push(String(i))
}
return result
}
console.log(fizzBuzz(15))