javascript算法学习(一)

前言

每一周都记录一下学习算法的题目以及解法

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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值