JS 基本逻辑算法题

1.问题
输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符串不可以使用replace
例如:输入“They are students” 和“aeiou”
则删除之后的第一个字符串变成 “Thy r stdnts”
分析
(1)在字符串1中把字符串2中的字母挨个找一遍,所以要遍历字符串2;
(2)将字符串1中出现的字母删掉,用split[split(“指定的字符串”),用来切割字符串中指定的字符串的,返回的是字符串的数组;用谁切割谁就没了];
(3)将返回的数组变为字符串,用join[join用来对数组进行拼接]
法1:最优方案

var str1="They are students";
    var str2="aeiou";
    for(var index in str2){
        str1=str1.split(str2.charAt(index)).join("");  //用str2.charAt(index)将str1中的字符串切割,返回字符串的数组,再用join()进行拼接
    }
    console.log(str1);  //Thy r stdnts

法2

var str1="They are students";
    var str2="aeiou";
    var arr=str1.split("");
    for(var index in str2){
        var s=str2.charAt(index);  //即每单个字符;charAt(index)取字符串中的索引;charAt()即根据索引取出索引位所对应的字符,括号里写索引
        for(var key in arr){
            if(arr[key]===s){  //arr[key]拿到数组里的每个节点的数字或字符
                arr.splice(key,1);
            }
        }
    }
    console.log(arr.join(""));  //Thy r stdnts

知识点:检查代码的运行速度
在代码开始前写console.time(); 代码最后写console.timeEnd();

2.问题:计算字符串中某个字符的个数
例:计算’1231011211009181’中1的个数

var aaa = '1231011211009181';
    function selectChar(str){
        var count=0;
        for(var key in aaa){
            if(aaa.charAt(key)===str){  //aaa.charAt(key)取到当前字符
                count++;
            }
        }
        return count;
    }
    console.log(selectChar("0"));

3.问题:找到字符串’woainixiaoli’中的每一个’i’出现的位置
使用indexOf()

语法 Object(string/array).indexOf(searchValue, fromIndex);
参数1 需检索的字符串值
参数2 规定在字符串中开始检索的位置(包括自身)。若省略,则从字符串的首字符开始检索
返回值是数字(索引),若检索不到,返回-1
var arr = 'woainixiaoli';
    var index = -1;   //定义变量index控制索引值
    //当查找不到a,即indexOf()的值为-1时,结束循环
    do {
        index = arr.indexOf("i", index + 1);  //使用第二个参数index+1,控制每一次查找都是从上一次查找到字符a的下一个索引位置开始
        if (index != -1) {    //可以找到字符i
            console.log(index);   //输出a的位置
        }
    } while (index != -1);

4.问题:求字符串’zhaochucichuzuiduodezifu’最多的字符

var str = "nininihaoa";
        var o = {};
        for (var i = 0, length = str.length; i < length; i++) {
            var char = str.charAt(i);
            if (o[char]) {   //char就是对象o的一个属性,o[char]是属性值,o[char]控制出现的次数
                o[char]++;  //次数加1
            } else {
                o[char] = 1;    //若第一次出现,次数记为1
            }
        }
        console.log(o);   //输出的是完整的对象,记录着每一个字符及其出现的次数
        //遍历对象,找到出现次数最多的字符的次数
        var max = 0;
        for (var key in o) {
            if (max < o[key]) {
                max = o[key];   //max始终储存次数最大的那个
            }
        }
        for (var key in o) {
            if (o[key] == max) {
                //console.log(key);
                console.log("最多的字符是" + key);
                console.log("出现的次数是" + max);
            }
        }

5.问题:实现函数的连用
例:add(1)(2)(3)… 参数之和
考点:递归、闭包、重写方法

function add(num){
            var a=num;
            var t=function (x){
                a=a+x;
                return t;
            };
            //重写toString()   自动执行  重写方法
            t.toString=function (){
                return a;
            }
            return t;
        }
        console.log(add(1)(2)(3)(4));

6.问题:数组的去重
分析:用枚举对象来做,因为一个对象的行为和属性都是固定的,可以把数组里的值看作元素对象的属性,如下数组中1是一个属性,再来一个1就重了,重了就可以去掉

 var a = [1, 2, 3, 4, 1, 2, 3, 1, 2];
        var obj = {};  //定义一个空对象
        for (var key in a) {
            /*hasOwnProperty 判断对象里面是否存在属性,返回值为true或false*/
            if (!obj.hasOwnProperty(a[key])) {
                obj[a[key]] = "";
            }
        }
        var s = [];  //定义一个数组
        for (var key in obj) {
            s.push(key);  //将属性名称转为数组
        }
        console.log(s);

:数组的key指索引,对象的key指对象里的属性名称

7.问题:不借助第三变量,两个变量交换

  var a = 5;
  var b = 3;
  b = a + b;
  a = b - a;
  b = b - a;

猜你喜欢

转载自blog.csdn.net/weixin_43675447/article/details/87990035