美文网首页
字符串练习

字符串练习

作者: 心存美好 | 来源:发表于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