Skip to content

字符串

概念

什么是字符串

字符串是若干个字符组成的有限序列,也可以理解为一个字符数组,但是很多语言对字符串做了很多特殊的规定。

第一部分 练习题

INFO

反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 `s` 的形式给出。

不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。

示例:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

代码示例:

typescript
/**
 * 思路:
 * 如果数组是偶数长度,则将第一个元素与第n个元素交换,第二个与第 n-1个元素交换,以此类推
 * 如果是奇数长度,则中点的元素不需要交换
 * @param s 
 */
function reverseString(s: string[]): void {
  //只需迭代数组长度的一半
  for (let i = 0, len = s.length; i < Math.floor(len / 2); i++) {
    //交换对称元素的位置
    [s[len - i - 1], s[i]] = [s[i], s[len - i - 1]];
  }
}

INFO

反转字符串

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

代码示例:

typescript
function reverseStr(s: string, k: number): string {
  let left: number, right: number
  let arr = s.split('')
  for (let i = 0, length = arr.length; i < length; i += 2 * k) {
    left = i
    right = i + k - 1 > length ? length - 1 : i + k - 1
    while (left < right) {
      ;[arr[left], arr[right]] = [arr[right], arr[left]]
      left++
      right--
    }
  }
  return arr.join('')
}

第二部分 练习题

INFO

翻转字符串里面的单词

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

**注意:**输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例:

输入:s = "the sky is blue"
输出:"blue is sky the"

代码实现:

typescript
function reverseWords(s: string): string {
    /** Utils **/
    // 删除多余空格, 如'   hello     world   ' => 'hello world'
    function delExtraSpace(arr: string[]): void {
        let left: number = 0,
            right: number = 0,
            length: number = arr.length;
        while (right < length && arr[right] === ' ') {
            right++;
        }
        while (right < length) {
            if (arr[right] === ' ' && arr[right - 1] === ' ') {
                right++;
                continue;
            }
            arr[left++] = arr[right++];
        }
        if (arr[left - 1] === ' ') {
            arr.length = left - 1;
        } else {
            arr.length = left;
        }
    }
    // 翻转字符串,如:'hello' => 'olleh'
    function reverseWords(strArr: string[], start: number, end: number) {
        let temp: string;
        while (start < end) {
            temp = strArr[start];
            strArr[start] = strArr[end];
            strArr[end] = temp;
            start++;
            end--;
        }
    }

    /** Main code **/
    let strArr: string[] = s.split('');
    delExtraSpace(strArr);
    let length: number = strArr.length;
    // 翻转整个字符串
    reverseWords(strArr, 0, length - 1);
    let start: number = 0,
        end: number = 0;
    while (start < length) {
        end = start;
        while (strArr[end] !== ' ' && end < length) {
            end++;
        }
        // 翻转单个单词
        reverseWords(strArr, start, end - 1);
        start = end + 1;
    }
    return strArr.join('');
};

INFO

右旋转字符串

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。

输出:输出共一行,为进行了右旋转操作后的字符串。

代码实现:

typescript
function _RotateRightstring(n: number, s: string) {
  let slist = s.split('');
  //整体反转字符串
  const reverse = (s: string[], begin: number = 0, end: number) => {
    let left = begin,right = end;
    while (left < right && right < s.length) {
      [s[left], s[right]] = [s[right], s[left]];
      left++;
      right--;
    }
    return s;
  };

  //反转整个字符串
  slist = reverse(slist, 0, slist.length - 1);
  //反转第一个子字符串
  slist = reverse(slist, 0, n - 1);
  //反转第二个子字符串
  return reverse(slist,n,slist.length)
}
const res = _RotateRightstring(2, 'abcdefg');