美文网首页
js算法题

js算法题

作者: nucky_lee | 来源:发表于2019-08-14 15:13 被阅读0次

1、js 正则表达式题

var s1 = "get-element-by-id"; 给定这样一个连字符串,写一个function转换为驼峰命名法形式的字符串: "getElementById"

用正则api把 -e -b -i 分别转换成大写就可以了。

var f = function (s) {
        return s.replace(/-\w/g, function (x) { return x.slice(1).toUpperCase(); });
    }

2、 回文

回文是一个单词或短语,它的读法是前后一致的(如“Cigar? Toss it in a can. It is so tragic”)。写一个函数来检查。
var string = 'Cigar? Toss it in a can. It is so tragic';

方法一:

var funcA = (str) => {
    var regExp = /[a-zA-Z]/g; //创建一个正则表达式,过滤非字母的字符
    // String.prototype.match()一次性返回所有匹配成功的结果 
    var arr = str.match(regExp);
   //reverse方法用于颠倒排列数组元素,返回改变后的数组。注意,该方法将改变原数组。
  //join()方法以指定参数作为分隔符,将所有数组成员连接为一个字符串返回。如果不提供参数,默认用逗号分隔。
    return arr.reverse().join('').toLowerCase() === arr.join('').toLowerCase()
}

if (funcA(string)) {
    console.log('这是回文!')
};

方法二:

const isPalindrome = string => {
//split方法按照给定规则分割字符串,返回一个由分割出来的子字符串组成的数组。
    const validCharacters = "abcdefghijklmnopqrstuvwxyz".split("")
//toLowerCase方法用于将一个字符串全部转为小写,toUpperCase则是全部转为大写。它们都返回一个新字符串,不改变原字符串。
//reduce方法和reduceRight方法依次处理数组的每个成员,最终累计为一个值。它们的差别是,reduce是从左到右处理(从第一个成员到最后一个成员),reduceRight则是从右到左(从最后一个成员到第一个成员),其他完全一样。reduce方法第一个参数都是一个函数,第二个参数为累积变量指定初值。
    const stringCharacters = string // 过滤掉特殊符号
        .toLowerCase()
        .split("")
        .reduce(
            (characters, character) =>
                validCharacters.indexOf(character) > -1
                    ? characters.concat(character)
                    : characters,
            []
        ); //[]为reduce第二个参数,即characters的初始值。
    return stringCharacters.join("") === stringCharacters.reverse().join("")
}

if (isPalindrome(string)) {
    console.log('这是回文2!')
};

3、 整数反转

给定一个整数,反转数字的顺序。
比如:

assert.equal(reverse(1234), 4321);
assert.equal(reverse(-1200), -21);
const revserInteger = integer => parseInt(number
      .toString()
      .split('')
      .reverse()
      .join('')) * Math.sign(integer)
//Math.sign(integer)获取数值符号

4. 出现次数最多的字符

给定一个字符串,返回出现次数最多的字符

var string = 'Hello World!';

var func = (string) => {
    var arr = string.split('');
    var maxTime = 1;
    var characterL = '';
    var obj = {};
    arr.forEach((ele, index) => {
        if (obj[ele]) {
            // 如果之前出现过,次数+1
            obj[ele] += 1;
            if (obj[ele] > maxTime) {
                maxTime = obj[ele];
                characterL = ele;
            }
        } else {
            // 每个字符出现次数为1
            obj[ele] = 1;
        }
    });
    return characterL;
}

5、数组分隔

给定数组和大小,将数组项拆分为具有给定大小的数组列表。

chunk([1, 2, 3, 4], 2), [[1, 2], [3, 4]]);
chunk([1, 2, 3, 4], 3), [[1, 2, 3], [4]]);
chunk([1, 2, 3, 4], 5), [[1, 2, 3, 4]]);
var array = [1,2,3,4];
var size = 3;

var func = (arr, size) => {
    var chunks = [];
    var index = 0;
    if (size >= arr.length) return chunks.push(arr);
    while (index < arr.length) {
        chunks.push(arr.slice(index, index + size));
        index += size;
    }
    return chunks;
}
console.log('chunks=', func(array, size));
// [[1, 2, 3], [4]]

本题主要考察slice方法,slice方法用于提取目标数组的一部分,返回一个新数组,原数组不变。arr.slice(start, end);end参数可以大于数组长度,如下:

var a = ['a', 'b', 'c'];
var aaa = a.slice(1,4);
console.log('aaa', aaa); // ["b","c"]

6、words反转

给定一个短语,按照顺序反转每一个单词。

assert.equal(reverseWords("I love JavaScript!"), "I evol !tpircSavaJ");
var string = 'I love JavaScript!';
var func = string => {
    var reverseWorlds = string.split(' ').map(ele => {
        return ele.split('').reverse().join('');
    }).join(' ');
    console.log('reverseWorlds', string, reverseWorlds);
}
func(string);

map方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回。

7、首字母大写

给定一个短语,每个首字母变为大写。
assert.equal(capitalize("hello world"), "Hello World");

var str = 'hello world';
var upperStr = str.split(' ').map(ele => {
    var words = ele.split('');
    return words.join('').replace(words[0], words[0].toUpperCase())
}).join(' ');
console.log('upp', upperStr);

String.prototype.replace() 方法用于替换匹配的子字符串,一般情况下只替换第一个匹配(除非使用带有g修饰符的正则表达式,如'aaa'.replace(/a/g, 'b') // "bbb")。

9、凯撒密码

给定一个短语,通过在字母表中上下移动一个给定的整数来替换每个字符。如果有必要,这种转换应该回到字母表的开头或结尾。

assert.equal(caesarCipher("I love JavaScript!", 100), "E hkra FwrwOynelp!")
assert.equal(caesarCipher("I love JavaScript!", -100), "M pszi NezeWgvmtx!");
var string = 'I love JavaScript!';

var func = (string, size) => {
    var zm = "abcdefghijklmnopqrstuvwxyz";
    var zmArr = zm.split('');
    var upperZm = zm.toUpperCase();
    var upperZmArr = upperZm.split('');
    var recordIndex = size % 26;
    if (recordIndex === 0) return string;
    if (recordIndex < 0) {
        zmArr = zm.split('').reverse();
        upperZmArr = upperZm.split('').reverse();
        recordIndex = Math.abs(recordIndex);
    }
    console.log('recordIndex=', recordIndex);
    return string.split('').map(ele => {
        if (zm.match(ele) !== null) {
            var index = recordIndex - (26 - zmArr.indexOf(ele));
            return zmArr[index];
        } else if (upperZm.match(ele) !== null) {
            var index = recordIndex - (26 - upperZmArr.indexOf(ele));
            return upperZmArr[index];
        }
        return ele;
    }).join('');
}

相关文章

  • js算法题

    1、js 正则表达式题 var s1 = "get-element-by-id"; 给定这样一个连字符串,...

  • js 算法题

    面试发现自己的算法知识有不足,因此参考了多篇文章学习总结。 冒泡排序 比较相邻的元素。如果第一个比第二个大,就交换...

  • js算法题

    1.数组去重 方法一:利用嵌套for循环和splice去重 方法二:利用indexOf去重 方法三:利用Set集合...

  • JS算法题总结

    1. 对象深克隆 2. 数组去重 方法一: 方法二: 3. 数组扁平化 方法一: 方法二: 4. 冒泡排序

  • js面试常见算法题

    数组去重 洗牌算法 写一个函数,统计字符串里出现出现频率最多的字符 冒泡排序

  • JS面试算法题

    数组快速排序 数组去重

  • 十道前端面试题第【03】篇

    摘要:本篇分享了10道面试题——Web性能优化方案、JS严格模式、五道算法题、自定义JS事件系统、输入URL到浏览...

  • Android面经| 算法题解

    整理了校招面试算法题,部分《剑指offer》算法题,以及LeetCode算法题,本博文中算法题均使用Java实现校...

  • process.stdin的end事件如何触发?---关于nod

    最近想用js来写一点简单的算法题,node是使用process.stdin和process.stdout来实现标准...

  • JS面试题(算法题)

    1. 数组扁平化 2.数据去重 3.对象的深拷贝 4.函数的节流和防抖 参考我写的另一篇 5.实现(5).add(...

网友评论

      本文标题:js算法题

      本文链接:https://www.haomeiwen.com/subject/urwgjctx.html