字符串

346 阅读4分钟

一:字符串基本方法

1.1:字符串读取值

  1. 直接用下标
  2. .charAt[]
let str = 'hello world'
console.log(str.charAt(6));//读取字符串第6位--->w
console.log(str[6]);//读取字符串第6位--->w

1.2:字符串添加值

  1. 直接拼接
let str = 'hello world'
let newStr = str + 'Tom'
console.log(newStr);//hello worldTom

1.3:字符串删除值:

字符串中没有自带的方法删除值:

  1. 借助有删除属性的结构实现,比如数组的splice属性
    • .split(''):将字符串转换为数组,引号内为空,表示以空的间隙切割
    • .splice(a,b):删除下标为a开始的b个元素,并返回移除元素
    • .join(''):将数组转换为字符串,引号内为空,表示以空为拼接成字符串
let str = 'hello world'
let strArr = str.split('')//字符串转数组
strArr.splice(2,2)//删除元素 'll'
console.log(strArr.join(''));//数组转字符串,输出heo world
  1. 自己手写一个方法实现
  • 构建新字符串:通过遍历原字符串,创建一个新字符串,仅包含除指定索引外的所有字符。

  • 条件判断:在遍历过程中,使用条件语句检查当前字符的索引是否为要删除的索引,如果不是,则将该字符添加到新字符串中。

let str = 'hello world'
function spliceStr(str,index){
    let newStr = ''
    for(let i=0;i<str.length;i++){
        if(i!=index){
            newStr += str[i]
        }
    }
    return newStr
}
console.log(spliceStr(str,1));//输出hllo world
  1. 利用字符串的.slice属性

相当于拓印,不会影响原数组,返回切割下来的值。注意该方法接收两个参数表示下标,.slice(a,b)表示从下标为a的切割到下标为b-1的范围,是左闭右开切割,下标为b的值不会被切割下来

let str = 'hello world'
console.log(str.slice(1,3));//输出el--->slice左闭右开

二:面试中的字符串算法:如何判断字符串是否为回文

2.1:利用数组判断

字符串转换为数组并反转

  • 使用 split('') 方法将字符串 str 转换为字符数组。这将每个字符作为数组的一个元素。
  • 使用 reverse() 方法反转数组中的元素顺序。对于回文字符串,反转后的数组元素顺序将会和原数组相同。
  • 使用 join('') 方法将反转后的数组重新组合成字符串。
let str = 'aba'//回文字符串
function isPalindrome(str){
    let arr = str.split('').reverse()//字符串转数组,再反转
    let newStr = arr.join('')//数组转字符串
    if(newStr==str){
       console.log('yes')
    } else {
    console.log('no');
}

2.2:遍历字符串

  1. 获取字符串长度

    • 变量 len 被设置为 str.length,用于存储字符串的长度。这一步是必要的,因为在循环中需要使用字符串的长度来确定比较的范围。
  2. 循环对比首尾字符

    • 使用 for 循环从第一个字符开始,直到字符串中间的字符(len/2),对每一对首尾对应的字符进行比较。
    • 在每次循环中,i 从 0 增加,str[i] 代表从左边开始的字符,而 str[len-1-i] 代表从右边开始的相应位置的字符。
let str = 'aba'; 
function isPalindrome(str) { 
    const len = str.length; 
    for (let i = 0; i < len / 2; i++) { 
        if (str[i] !== str[len - 1 - i]) { 
        console.log('false'); return; // 结束函数执行
       } 
     } 
    console.log('true'); // 如果没有提前返回,表示是回文串
  } 
isPalindrome(str);

2.3:双指针

  1. 两端向中心逼近更新指针

    • 初始化两个指针 i 和 j,其中 i 指向字符串的起始位置而 j 指向字符串的末尾位)。如果当前的 i 和 j 指向的字符相等,算法将 i 向右移动一位,j 向左移动一位,即 i++ 和 j--,这样逐步向字符串中心逼近。
  2. 判断与退出

    • 如果在任何时刻 i 和 j 指向的字符不相等,说明字符串不是回文,此时算法输出 "false" 并通过 break 语句退出循环。
    • 如果循环正常结束,即 i 和 j 相遇或交错(i >= j),这表示所有的比较都成功,字符串是回文,算法输出 "true"
let str = 'aba';
function isPalindrome(str) {
    let i = 0;
    let j = str.length - 1;
    while (i < j) {
        if (str[i] === str[j]) {
            i++;
            j--;
        } else {
            console.log('false');
            break;
        }
    }
    if (i >= j) { 
        console.log('true');
    }
}
isPalindrome(str);

三:总结

3.1:字符串基本方法

1:读取字符串值

  • 使用下标或 .charAt() 方法读取字符串中的单个字符。

2:添加字符串值

  • 通过字符串拼接(使用 + 运算符)添加新的字符或子串到现有字符串。

3:删除字符串值

  • 字符串本身没有直接的删除方法,可以通过多种间接方式实现删除:

    • 转换成数组,使用 .splice() 方法删除,再转回字符串。
    • 手写函数遍历字符串,忽略指定位置的字符,构建新字符串。
    • 利用 .slice() 方法截取字符串的子串,排除指定位置的字符。

3.2:回文字符串的判断

1:利用数组判断

  • 将字符串转换为数组,反转数组,再转换回字符串,比较是否与原字符串相等。

2:遍历字符串

  • 获取字符串长度,使用 for 循环比较首尾字符直至字符串中间,判断是否为回文。

3:双指针

  • 初始化两个指针,一个在头部,一个在尾部,逐步向中心逼近,比较对应位置的字符是否相等。