美文网首页
字符串练习

字符串练习

作者: 心存美好 | 来源:发表于2021-11-04 15:59 被阅读0次

    练习一

    封装函数检查字符串结尾是否以 参数二 结尾:
    例如:输入confirmEnding("He has to give me a new name", "me")返回true

    分别采用字符串截取的几种方式解决问题
     function aa(str, b) {
          var len = b.length;
          // var newstr = str.substr(str.length - len,len);
    
          //截取字符串方法一substr(开始位置,个数) 
          // var newstr = str.substr(str.length - len);//第二个参数可以不传
          // var newstr = str.substr(- len)//也可以传个负数
          // if(newstr == b ){
          //   return true
          // }else{
          //   return false
          // }
          // var newstr = str.substring(str.length - len ,str.length);
    
          //截取字符串方法二 substring(开始位置,结束位置)不包含结束位置 
          // var newstr = str.substring(str.length - len ,str.length);
          //第二个参数可以不传。不支持传负数
    
          // 截取字符串方法三slice(开始,结束)
          // var newstr = str.slice(str.length - len ,str.length);
          // var newstr = str.slice(str.length - len );//可以一个参数
    
          var newstr = str.slice(- len);//可以负数,比substring多了可以传负数的写法
          return newstr == b; //这是比三目更简的写法 return newstr == b ?true:false;
        }
        var bol = aa("How are you,I am fine.What is your name", "me")
        console.log("返回结果bol为", bol);
    
    也可以采用字符串切割为数组的方式解决,判断切割后的数组最后一项是不是空字符串
     function aa(str, b) {
          var arr = str.split(b)
          console.log(arr);
          return arr[arr.length - 1] === '' ? true:false;
          // return !arr[arr.length - 1]//可以简写为  三目或if的条件结果就是true或false,注意要取反,因为去掉是否等于空字符串了 === ''
              
        }
        var bol = aa("How are you,I am fine.What is your name", "me")
        console.log("返回结果bol为", bol);
    

    练习二封装函数 用来反转数字

    例如:输入reverseNumber(123456);返回654321

    方法一利用数字取模
    function aa(num){
      var res = 0;
      while(num){
         res = res *10 + num % 10;
         num = parseInt(num / 10);
      }
      return res;
    }
    console.log(aa(123456789));
    
    方法二利用字符串循环(通过字符串的长度控制循环次数)
    function aa(num){
      var res = 0;
      var len = (num + "").length;
      for(var i=0;i<len;i++){
        res = res *10 + num % 10;
        num = parseInt(num / 10);
      }
      return res;
    }
    console.log(aa(123456789));
    
    方法三利用字符串
    function aa(num){
      var res = '';
      var str = num +'';
      var len = str.length;
      for(var i = len-1; i >= 0 ; i--){    //采用从大到小i-- i要大于等于零
        res += str[i] 
      }
      return +res;
    }
    console.log(aa(123456789));
    
    方法四 转为字符串,切割为数组,再反向reverse
    function aa(num){
      var res = '';
      var str = num +'';
      var arr = str.split("")
      arr.reverse();   //数组反向倒序后会修改自己本身
      res = arr.join("");
      return +res;
    }
    console.log(aa(123456789));
    

    练习三 在数组中查询某个数字出现了几次

    var arr = [ 10,20,30,40,30,60,20,40,60,10,40]//查询40出现了几次
    var index = arr.indexOf(40);
    console.log(index);
    var arrs=[];
    while(index > 0){
      arrs.push(index);
      index = arr.indexOf(40,index+1);
    }
    console.log(arrs)
    

    练习四去除字符串前后中间空格

    var str="    hello      world     ";
    console.log(str);
    var arr = str.split("");
    for(i=arr.length-1;i>=0;i--){
        if(arr[i]==" "){
            arr.splice(i,1)
        }
    }
    console.log(arr.join(""));
    

    练习五字符串首字母大写

    var str="hello siri you are rubbish";
    var arr=str.split(" ");
    var newstr="";
    var newArr=[];
    for(i=0;i<arr.length;i++){
        newstr = (arr[i][0]).toUpperCase() + arr[i].substr(1);
        newArr.push(newstr);
    }
    console.log(newArr);
    console.log(newArr.join(" "));
    

    练习六写一个函数对传入的字符串输出所有子字符串组合

    例如:输入substrings('dog'); 返回['d', 'do', 'dog', 'o', 'og', 'g']

    function aa(str){
      var arr= [];
      var len = str.length;
      console.log(len);
      for(var i=0; i < len; i++){
        for(var j=1; j<len - i; j++){
          arr.push(str.substr(i,j));
        }
      }
      return arr;
    }
    var result = aa("xincun");
    console.log(result);
    

    练习七写一个函数对传入的字符串重新按字母排序

    (排序有 sort 和 reserse)
    例如:输入reorderStr('webmaster');返回 abeemrstw

    function aa(str){
      return str.split("").sort().join("");
    }
    console.log(aa('dfadsghtwerwaqr'));
    

    练习八写一个函数对传入的字符串中每个单词的首字母大写

    例如:输入myCap('the quick brown fox'); 返回654321 The Quick Brown Fox

    方法一采用字符串切割的方法
    function aa(str){
      var arr = str.split(" ");
      var len = arr.length;
      for(var i = 0;i <len; i++){
        arr[i]= arr[i].substr(0,1).toUpperCase() + arr[i].substr(1);
      }
      arr = arr.join(" ");
      return arr;
    }
    console.log(aa("you are right thanks"));
    
    方法二 用替换的方法replace()
    function aa(str){
      var arr = str.split(" ");
      var len = arr.length;
      for(var i = 0;i <len; i++){
        arr[i]= arr[i].replace(arr[i][0],arr[i][0].toUpperCase());
      }
      arr = arr.join(" ");
      return arr;
    }
    console.log(aa("you are right thanks"));
    

    练习九 写一个函数找出传入的字符串中最长的单词

    例如:输入findLongest('Web Development Tutorial'); 返回 Development

    方法一:利用变量存当前数组中最长长度及其索引
    function aa(str){
      var arr = str.split(" ");
      var len = 0;
      var index = 0;
      for(var i = 0 ;i < arr.length; i++){
        if(arr[i].length > len){
          len = arr[i].length;
          index = i;
        }    
      }
      return("句子中最长字符串为" + arr[index] +"长度为"+ len + "下标为" + index)
    }
    
    console.log(aa("aaa bbbbb cccccccc ddddddddddddd eee fffff"));
    
    方法二:利用变量直接存最长的字符串
    function aa(str){
      var arr = str.split(" ");
      var Maxstr = '';
      for(var i = 0 ;i < arr.length; i++){
        if(arr[i].length > Maxstr.length){
          Maxstr = arr[i]
        }    
      }
      return("句子中最长字符串为" +  Maxstr +"长度为"+  Maxstr.length)
    }
    console.log(aa("aaa bbbbb cccccccc ddddddddddddd eee fffff"));
    

    练习十封装函数 实现toUpperCase方法

    例如: 输入myUpperCase("hello"); 返回HEllo
    
        function aa(str){
          str = str || '';// 如果用户不传参,要提前想到,不传参默认是undefined,undefined的length不存在就会报错,空字符的length为0
          var len = str.length;
          var newstr = '';
          for(var i = 0;i <len; i++){
            var charcode = str.charCodeAt(i)//获取字符的ASCII
            if(charcode<=122 && charcode >=97){
              newstr += String.fromCharCode(charcode -32)
            }else{
              newstr += str[i] 
            }
          }
          return newstr;
        }
    console.log(aa('dafgd134fafsdf!,dsfsd123'));
    

    练习十一封装函数 实现数组sort的方法(参考冒泡排序)

    例如:输入mySort([2,33,41,10,5]); 返回 [2,5,10,33,41]

    function mysort(arr){
      var len = arr.length;
    
      for(var i=0;i<len-1;i++){
        for(var j=0;j<len-1-i;j++){
          if(arr[j] < arr[j+1]){   //如果从大到小就改为<
            var temp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] =temp;
          }
        }
      }
      return arr
      console.log(arr);
    }
    console.log(mysort([10,46,33,48,21,18,4,13]));
    

    练习十二删除数组中的假值去除数组的负项

    例如:输入bouncer([7, "ate", "", false, 9]); 返回[7,"ate",9]

    方法一从前往后
    function bouncer(arr){
      for(var i=0 ;i<arr.length;i++){   //实时获取数组的长度,使用i<arr.length
        if(!arr[i]){
          arr.splice(i ,1);
          i--;                    //如果条件符合,length就会减一,所以i要回归一次,防止跳过,如果改为从后往前就不存在跳过的问题
        }
      }
      return arr;
    }
    console.log(bouncer([7, "ate", "", false, 9,0,00,NaN,99]));
    
    方法一从后往前
    function bouncer(arr){
      for(var i=arr.length-1;i>=0;i--){  
        if(!arr[i]){
          arr.splice(i ,1);                 
        }
      }
      return arr;
    }
    console.log(bouncer([7, "ate", "", false, 9,0,00,NaN,99]));
    

    练习十三比较字符串,如果第一个字符串中包含了第二个字符串的所有字母,则返回true,否则返回false

    例如:输入compare(["hello", "heo"]); 返回true

    方法一 字符串方法indexOf()
    function compare(arr){
      var str = arr[1];
      var len = arr[1].length;
      for(var i=0; i<len; i++){
        if((arr[0].indexOf(str[i]))=== -1){
          return false;
        }
      }
      return true;
    }
    console.log(compare(["hello", "heo"]));
    
    方法二 数组方法indexOf()
    function compare(arr){
      var arr2 = arr[1].split("");
      var arr3 = arr[0].split("");
      var len = arr2.length;
      for(var i=0; i<len; i++){
        if((arr3.indexOf(arr2[i]))=== -1){
          return false;
        }
      }
      return true;
    }
    console.log(compare(["hello", "he1o"]));
    
    方法三数组方法包含includes()
    function compare(arr){
      var arr2 = arr[1].split("");
      var arr3 = arr[0].split("");
      var len = arr2.length;
      for(var i=0; i<len; i++){
        if(!arr3.includes(arr2[i])){
          return false;
        }
      }
      return true;
    }
    console.log(compare(["hello", "heo"]));
    

    练习十四封装函数 用指定字符串替换字符串的

    例如:输入replaceStr('l am wuwei','wuwei','sixsixsixx')

    方法一:(只能替换一次)
    function replaceStr(str,aa,bb){
      var newstr = str.replace(aa,bb)
      return newstr;
    }
    console.log(replaceStr("wo shi jing,jing shi mama","jing","xincunmeihao"));
    
    方法二 多个时使用循环语句,while只要条件满足就循环
    function replaceStr(str,aa,bb){
      var newStr=str;//尽量不修改原数据,防止后面会用到,所以定义newStr
      while(newStr.indexOf(aa) !== -1){
        newStr = newStr.replace(aa,bb)
      }
      return newStr
    }
    console.log(replaceStr("wo shi jing,jing shi mama,jing jing","jing","xincunmeihao"));
    
    方法三可以改为for循环
    function replaceStr(str,aa,bb){
      var newStr=str;//尽量不修改原数据,防止后面会用到,所以定义newStr
      for(;newStr.indexOf(aa) !== -1;){ //只要保证for循环的判断条件能从true到false的变化就行
        newStr = newStr.replace(aa,bb)
      }
      return newStr
    }
    console.log(replaceStr("wo shi jing,jing shi mama,jing jing","jing","xincunmeihao"));
    
    方法四 递归
    function replaceStr(str,aa,bb){
      if (str.indexOf(aa) == -1){
        return str;
      }
      var newStr=str.replace(aa,bb);
      return replaceStr(newStr,aa,bb)
    }
    console.log(replaceStr("wo shi jing,jing shi mama,jing jing he jing","jing","xincunmeihao"));
    

    练习十五封装函数 实现push方法

    方法一数组可以通过下标加值,每次只能加一个值
    function mypush(arr,num){
      arr[arr.length]=num;
      return arr;
    }
    var oldarr=[10,30,20];
    console.log(mypush(oldarr,50));
    console.log(mypush(oldarr,60));
    console.log(mypush(oldarr,70));
    
    方法二通过实参列表arguments[]实现用户传多个参数
    function mypush(arr,num){
      for(var i=1;i<arguments.length;i++){
        arguments[0].push(arguments[i])
      }
      return arguments[0];
    }
    var oldarr=[10,30,20];
    console.log(mypush(oldarr,50,61,72,83,94,105));
    
    方法三把自己写的方法添加给数组的属性(或者直接添加到原型链上,方便所有数组调用)
        function myPush() {
          // arguments; [arr,30,40,50)]
          for (var i = 0; i < arguments.length; i++) {
            this.push(arguments[i])  //this是对象
          }
          return this
        }
        var arr = [10, 20]
        // arr.myPush=myPush; //给数组添加方法,只有arr可以使用myPush
        Array.prototype.myPush=myPush; //给原型链添加方法,每个调用myPush的数组都可以使用myPush方法了
        console.log(arr.myPush(30, 40, 50, 60,70, 80)) //隐式的this绑定
        var arr2=[11,22,33,44,55,66,77];
        console.log(arr2.myPush(30, 40, 50, 60,70, 80));
    

    练习十六封装函数 获取字符串中的数字,并按照数组输出

    例如:输入returnArr('shdkfh1234cxj5665sdkj2121') 返回[1234,5665,2121]
    采用分割字符串,判断ASCII码48-57范围内的就是数字

    function returnArr(str){
      var arr=[];
      var len = str.length;
      var num1 = 0,num2 = 0;//保存ASCII码
      var start = 0,end = 0;//数字开始索引,结束索引
      aa:for(var i = 0; i < len ; i++){
        num1 = str.charCodeAt(i);
        start = i;
        if(48 <= num1 && num1 <= 57){
          // 是数字进入
          for(var j = start;j<len;j++){
            num2 =str.charCodeAt(j);
            if(!(48 <= num2 && num2 <= 57)|| j == len-1){
              end =(48 <= num2 && num2 <= 57)&& j == len-1 ? j+1:j;//保证最后一位是数字时也能截取出来
              arr.push(str.slice(start,end))//不是数字就截取
              i = j;//将结束索引给开始
              continue aa;//结束内层循环,直接进入外层循环,外层打标签
            }
          }
        }
      }
      return arr;
    }
    console.log(returnArr('shdkfh1234cxj5665sdd555k444j2121'));
    

    练习十七封装函数 查找出第一个只出现一次的字符

    例如:unquie("wuwei"); 返回"u"

    方法一思路:从前往后,从后往前查询字符索引一样,说明只有一个,不一样至少两个
    function unquie(str){
      var len = str.length;
      for(var i=0;i<len;i++){
        var char = str[i];
        if(str.indexOf(char) === str.lastIndexOf(char)){
          return char;
        }
      }
      return "字符串中没有只出现一次的字符"
    }
    console.log(unquie("wuweieiaau"));
    

    练习十八封装函数 实现字符串去重

    例如:输入deweightStr("wuweiwu"); 返回'wuei'

    方法一同一个字符的索引不同,表示这个字符是重复的
    function unquie(str){
      var len =str.length;
      for(var i=0;i<len;i++){
        var char =str[i];
        if(str.indexOf(char) !== str.lastIndexOf(char)){ //字符串中同一个字符的索引不同,表示这个字符是重复的
          str=str.replace(char,"")
          i--;
        }
      }
      return str
    }
    console.log(unquie("wuweieiaaulilijingji"));
    
    方法二思路定义一个新空字符串,查询里面是否有相应的字符,如果没有,值为-1,就拼接进去,如果有了值就为相应的索引值,就不拼接
    function unquie(str){
      var len =str.length;
      var newStr = "";
      for(var i=0;i<len;i++){
        if(newStr.indexOf(str[i]) === -1){
          newStr += str[i];
        }
      }
      return newStr
    }
    console.log(unquie("wuweieiaaulilijingji"));
    console.log(unquie("aabbcdwegha"));
    
    方法三思路对象的属性是不能重复的,所以利用对象的属性来处理
    function unquie(str){
      var obj={};
      var len=str.length;
      var newStr="";
      for(var i=0;i<len;i++){
       var char =str[i];
       obj[char] = char;
      }
      for(var key in obj){
        newStr += key
      }
      return newStr;
    }
    console.log(unquie("wuweieiaaulilijingji"));
    console.log(unquie("aabbcdwegha"));
    console.log(unquie("jinhuajinhua"));
    

    练习十九封装函数 输出指定字符串的长度:

    提示: 一个中文占2个字节,一个英文占一个字节 str.length 得到的是字符的长度,中文英文都是占一个字符

    方法一
    function bytelen(str){
      var len = str.length;
      var bytelen = 0;
      for(var i=0;i<len;i++){
        if(str.charCodeAt(i)>255){
          bytelen += 2;
        }else{
          bytelen++
        }
      }
      return bytelen;
    }
    console.log(bytelen("abcENGLISH中文汉语"));
    
    方法二
    function bytelen(str){
      var len = str.length;
      var bytelen = len;   //中文只是少算一个字节,循环里加一
      for(var i=0;i<len;i++){
        if(str.charCodeAt(i)>255){
          bytelen ++;
        }
      }
      return bytelen;
    }
    console.log(bytelen("abcENGLISH中文汉语"));
    

    练习二十封装函数 获取浏览器url中的数据 要求:函数返回值是一个对象(字符串切割成对象后可以直接访问属性)

    var url =
           'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=baidu&wd=wuwwei&rsv_pq=becd1331000082fd&rsv_t=0f84&rqlang=cn&rsv_enter=1&rsv_sug3=14&rsv_sug1=12&rsv_sug7=100&rsv_sug2=0&rsp=0&inputT=9344&rsv_sug4=3518432'
    function paramsStrToObj(url){
     var obj={};
     var paramsStr = url.split('?')[1];
     var paramsArr =[];
     var milddleArr =[];
     if(paramsStr){//防止paramsStr中只有域名 https://www.baidu.com/s
       paramsArr = paramsStr.split("&")
     }
     for(var i=0 ;i<paramsArr.length;i++){
        milddleArr =paramsArr[i].split("=");
        obj[milddleArr[0]] = milddleArr[1];
      
     }
     return obj;
    }
    var result = paramsStrToObj(url)
    console.log(result);
    console.log(result.wd);
    
    反向拼接回去(知道对象,域名,拼接字符串地址url)

    结果 http://www.baicu.com?wd=123&time=123456

    var params = {
          wd: '123',
          time: 123456
      }
    var url = 'http://www.baidu.com'
    function paramsObjToStr(obj){
      var str="?";
      if(obj){ //判断对象是否存在
        for(var key in obj){
          str += key + "=" + obj[key]+"&"
        }
      }
      return str.slice(0,str.length-1);
    }
    console.log(paramsObjToStr(params));
    console.log(url + paramsObjToStr(params));
    

    相关文章

      网友评论

          本文标题:字符串练习

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