js常见算法题

285 阅读2分钟

1.判断一个单词是否是回文

function isPalindrome(str) {
    return str === str.split('').reverse().join('')
}
isPalindrome('neveroddoreven')  // true

2.数组去重

ES5

方法1:利用indexOf去重

function uniqueArr1(arr) {
    // 如果传入的不是数组,错误提示
    if (!Array.isArray(arr)) {
        console.log('type error')
        return false
    }
    // 如果是数组,开始操作
    let array = []
    for (let i = 0; i < arr.length; i++) {
        if (array.indexOf(arr[i]) === -1) {
            array.push(arr[i])
        }
    }
    return array
}

let arr = [1, 2, 3, 3, 4, 'a', 'b', 'b', 'q']
console.log(uniqueArr1(arr)) // [ 1, 2, 3, 4, 'a', 'b', 'q' ]

方法2:利用嵌套for循环和splice去重

function uniqueArr2(arr) {
    // 如果传入的不是数组,错误提示
    if (!Array.isArray(arr)) {
        console.log('type error')
        return false
    }
    for (let i = 0; i < arr.length; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            // 第一个等同于第二个,splice方法删除第二个
            if (arr[i] === arr[j]) {
                arr.splice(j, 1)
                j--
            }
        }
    }
    return arr
}

let arr = [1, 2, 3, 3, 4, 'a', 'b', 'b', 'q']
console.log(uniqueArr2(arr)) // [ 1, 2, 3, 4, 'a', 'b', 'q' ]

ES6

方法3:利用Set集合的唯一性去重

function uniqueArr3(arr) {
    return Array.from(new Set(arr))
}

let arr = [1, 2, 3, 3, 4, 'a', 'b', 'b', 'q']
console.log(uniqueArr3(arr)) // [ 1, 2, 3, 4, 'a', 'b', 'q' ]

3.统计字符串中出现最多的字母及其出现的次数

function repeatedStr(str) {
    // 用一个新对象的value值去当作次数
    let json = {}
    for (let i = 0; i < str.length; i++) {
        if (!json[str.charAt(i)]) {
            json[str.charAt(i)] = 1
        } else {
            json[str.charAt(i)]++
        }
    }
    let iMax = 0 // 次数
    let iKey = '' // 出现最多的字母
    // 遍历对象,找到出现次数最多的字母以及出现的次数
    for (let key in json) {
        if (json[key] > iMax) {
            iMax = json[key]
            iKey = key
        }
    }
    console.log('出现次数最多的是:' + iKey + ',出现' + iMax + '次')
}
repeatedStr('abcccccccccccbbbqqoo') // 出现次数最多的是:c,出现11次

4.计算一个整数的阶乘

function factorialize(num) {
    if (num < 1) {
        return 1
    }
    return num > 1 ? num * factorialize(num - 1) : 1;
}
console.log(factorialize(3)) // 6

5.冒泡排序(从小到大)

function bubbleSort(arr) {
    for (let i = 0; i < arr.length - 1; i++) {
        for (let j = 0; j < arr.length - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                let temp = arr[j]
                arr[j] = arr[j + 1]
                arr[j + 1] = temp
            }
        }
    }
    return arr
}

let arr = [1, 2, 20, 8, 12, 5]
console.log(bubbleSort(arr)) // [ 1, 2, 5, 8, 12, 20 ]

6.最高效的数组乱序方法

function randomSort(arr) {
    return arr.sort((a, b) => { return Math.random() > 0.5 ? -1 : 1; });
}

7.找出正数数组的最大差值

function getMaxDifference(arr) {
    let min = arr[0]
    let max = 0
    for (let i = 0; i < arr.length; i++) {
        min = Math.min(min, arr[i])
        max = Math.max(max, arr[i])
    }
    return max - min
}

let arr = [1, 2, 20, 8, 12, 5]
console.log(getMaxDifference(arr)) // 19

8.随机生成指定长度的字符串

function getRandomStr(n) {
    let str = 'abcdefghijklmnopqrstuvwxyz9876543210'
    let result = ''
    let length = str.length
    for (let i = 0; i < n; i++) {
        result += str.charAt(Math.floor(Math.random() * length))
    }
    return result
}

9.找出最长的单词

网上的大部分方法如果遇到有两个或两个以上相同长度的单词,都只能找到第一个,此处是改进后的方法,可以找到多个长度最长的单词

function findLongestWord(str) {
    let newStr = str.split(' ')
    let result = []
    let maxLength = 0
    // 遍历词组
    for (let i = 0; i < newStr.length; i++) {
        // 如果找到长度更大的,就清空数组,重新push
        if (newStr[i].length > maxLength) {
            result = []
            result.push(newStr[i])
            maxLength = newStr[i].length
        } else if (newStr[i].length === maxLength) { // 如果找到长度相同的,就直接push进去
            result.push(newStr[i])
            maxLength = newStr[i].length
        }
    }
    return result.join(',')
}

findLongestWord('my name is bigx') // name,bigx

10.string里每个单词的首字母大写

方法1:

function titleCase1(str) {
    return str.toLowerCase().split(" ").map((item)=>{
        return item.replace(item[0], item[0].toUpperCase())
    }).join(" ")
}
titleCase1('a little dog') // A Little Dog

方法2:

function titleCase2(str) {
    let arr = str.split(' ')
    for (let i = 0; i < arr.length; i++) {
        arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].slice(1)
    }
    return arr.join(' ')
}
titleCase2('a little dog') // A Little Dog

11.判断字符串是否以制定的字符串结尾

function confirmEnding(str, target) {
    return !!(str.slice(-target.length) === target)
}

console.log(confirmEnding('He has a new boyfriend', 'boyfriend')) // true

12.截断字符串

function truncate(str, num) {
    if (num >= str.length) return str
    if (num <= 3) return str.slice(0, num) + "..."
    if (str.length > num) return str.slice(0, num-3) + "..."
}

console.log(truncate('Absolutely Longer', 8)) // Absol...

13.判断一个字符串是否是某个字符串的子集

方法1:利用indexOf方法

function isInclude1(str1, str2) {
    return (str1.indexOf(str2) !== -1)
}
console.log(isInclude1('aaaaccceer', 'ac')) // true

方法2:利用search方法

function isInclude2(str1, str2) {
    return (str1.search(str2) !== -1)
}
console.log(isInclude2('aaaaccceer', 'ac')) // true

方法3:利用正则表达式

function isInclude(str1, str2) {
    let reg = new RegExp(str2, 'g')
    return !!str1.match(str2)
}
console.log(isInclude('aaaaccceer', 'ac')) // true

方法4:上面的方法只适用于str2整体包含于str1,如果是要判断str2中的每一个字符都包含于str1呢?可以通过遍历来实现

function isInclude(str1, str2) {
    // 将传入的两个字符串分别转成数组
    let _str1 = str1.split("")
    let _str2 = str2.split("")
    // 遍历子数组,通过indexOf方法判断子数组的每一个字符是否属于父数组,如果有一个不属于就返回false
    for(let i = 0; i < _str2.length; i++){
        if(_str1.indexOf(_str2[i]) == -1) {
            return false
        }
    }
    return true
}

console.log(isInclude('hello', 'eo')) // true

14. 统计字符串中每个字符出现的次数

function count(str) {
    // 先去除字符串的空格,并将其转换成数组
    let arr = str.replace(/\s*/g, '').split('')
    // 创建一个新对象用于统计字符出现的次数
    let result = {}
    // 遍历字符数组
    arr.forEach(item => {
        if (result[item] === undefined) {
            result[item] = 1
        } else {
            result[item] += 1
        }
    })
    return result
}

let str = 'hello world'
console.log(count(str)) // {h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1}

15. 判断是否为数组

方法1:instanceof

由于此方法用于判断一个数组是否为对象的时候也会返回true,所以不推荐使用

function isArray(arr) {    
    return arr instanceof Array
}

let arr1 = []
console.log(isArray(arr1)) // true

方法2:原型prototype + toString + call

此方法最为准确

function isArray(arr) {
    return Object.prototype.toString.call(arr) === '[object Array]'
}

let arr1 = []
console.log(isArray(arr1)) // true

方法3:isArray方法

let arr1 = []
console.log(Array.isArray(arr1)) // true