【数据结构】【学习笔记】字符串

字符串

字符串匹配

有字符串名为s时,

TypeScript

indexOf

s.indexOf(a, b) 用来查找某个元素或子字符串 \(a\) 第一次出现的位置。

找不到时返回-1。

数组里装的是若是对象或者子数组,indexOf 找的是内存地址

所以想根据对象的属性来找下标,应该用 arr.findIndex(item => item.name === "Alice")

如果 \(b\) 传入了一个负数(比如 -5),字符串会非常宽容地把它当做 0(从头开始找)。

includes

s.includes(a),直接判断s中是否有a,有则返回true,无则false。

C#

s.Contains(a) 只能从头开始找,找到时返回true,失败返回false。

C++

contains

这是C++23才有的方法。

std::string::contains 方法,直接返回 bool 值(true / false)。

用法:s.contains(a)

find

C++23之前的可以用find。

.find() 如果找到了会返回下标;如果找不到,它不会返回 -1,而是会返回一个 C++ 专有的死亡标记:string::npos

字符串截断

C#

  • s.Substring(a, b),获取字符串s[a...b]。
  • 切片语法:s[a..^b]
    • 符号含义:
      • ^ 倒序索引运算符,代表“从后往前数”,
        特别的,^0 代表数组的末尾边界(相当于 Length,通常只在切片时作为终点使用,直接访问 s[^0] 会报越界错误);
      • .. 范围运算符,语法格式:s[起点..终点];
      • a为起点(包含)。
    • 使用时省略开头或结尾;
    • 数组也能直接用;
    • 事实为提取具体的 Index 和 Range 对象:
      其实 ^1 和 1..^1 在 C# 底层是两个真正的结构体类型(Index 和 Range),你可以把它们存进变量里传来传去,如:
      Index lastElement = ^1; 
      Range middlePart = 1..^1;
      
      string s = "Hello";
      char last = s[lastElement];      // 'o'
      string mid = s[middlePart];      // "ell"
      

字符串复读

TypeScript

直接s.repeat(n)就好。

C#

1.使用LINQ

string res = string.Concat(Enumerable.Repeat(s, n));

Enumerable.Repeat(s, n) 负责把字符串 s 像复印机一样复印出 n 份(此时它是一个集合),然后 string.Concat 负责把这 n 份合成一整串。

在现代 .NET 中,string.Concat 的执行方法:先算好 s.Length * n 的总长度,然后在堆内存里一次性开辟好对应大小的空间把字符填进去,不会产生多余的中间垃圾。

2. 经典StringBuilder

string res = new StringBuilder(s.Length * n).Insert(0, s, n).ToString();

StringBuilder 的 Insert(idx, str, count) 方法支持“把某个字符串在指定位置重复插入 count 次”。这种写法在底层直接进行了内存块的复制(Block Copy、块复制),比普通复制快。

C++

1. 提前分配内存然后加

std::string str;
// 🌟 核心:提前把内存地盘分配好,防止后续追加时发生内存重新分配
str.reserve(n * (mul));
// 复印
for (int i = 0; i < mul; ++i) {
    str += a;
}

2. C++23管道流

#include <ranges>
#include <string>

std::string res = std::views::repeat(s, mul)
                | std::views::join
                | std::ranges::to<std::string>();
  • |为管道符号
  • std::views::repeat(s, mul):在内存中生成一个虚拟视图,它把字符串 s 虚拟地重复了 mul 次。⚠️注意:此时它并没有真正去复制内存,只是复制视图。
  • | std::views::join:repeat后结果只是集合,使用 join 把它们的所有字符横向拼在一起。
  • | std::ranges::to<std::string>():把前面这一串虚拟的字符流,真正打包成一个 std::string 对象。

字符和数字

TypeScript

字符转数字

1. 直接和数字相加
2. Number(str)

最简单,直接全部转为number

当不是全部是数字时,转换后的结果是isNaN,可以用Number.isNaN(val)检查。

3. parseInt(str, b)

str为字符串,b为几进制,转为整数

4. parseFloat(str)

转为浮点数

数字转字符串

1. 格式化法

`${num}`,注意:符号用的反引号。

2. String(num)

将数字转字符串

3. num.toString()

直接将数字转字符串

4. num.toFixed(a)

转字符串时保留a个小数位。

拓展

str.padStart(a, b)

当字符串的长度不足a时,在前面补充b字符串。

posted @ 2026-07-20 17:16  SEHOD  阅读(0)  评论(0)    收藏  举报