算法选择题:字符串(5 题)
011 在 C# 中统计字符串里用户可见的字符个数,哪种表述准确?
难度: 综合
- A. 所有 Unicode 字符都能放进单个 char,无需特殊处理
- B. 一个 char 一定对应一个用户看到的字符
- C. char 表示 UTF-16 代码单元,不保证对应完整可见字符;补充字符应按 Rune 处理,组合字符可能还需按文本元素处理
- D. s.Length 就是用户可见字符数
查看答案与解析
正确答案C
正确原因: C# char 表示 UTF-16 代码单元,不保证对应完整可见字符;补充字符应按 Rune,组合字符可能还需按文本元素处理。
错误选项辨析: A 项:char 只有 16 位,超出基本多语言平面的字符需要代理项对;B 项:emoji 等补充字符由两个 char(代理项对)组成,一个 char 并不完整;D 项:Length 统计的是 UTF-16 代码单元数,会多算补充字符。
012 需要判断两段代码中的方法名是否相同(忽略大小写),哪种做法最合适?
难度: 进阶
- A. 先 ToLower 再比较,在所有文化下都等价且无分配
- B. 标识符比较应使用 Ordinal 或 OrdinalIgnoreCase;面向用户的语言排序才使用明确的文化规则
- C. == 运算符与 string.Equals 总是采用文化规则,结果一致
- D. 用默认的 CurrentCulture 比较最稳妥,因为它最贴近用户习惯
查看答案与解析
正确答案B
正确原因: 标识符通常使用 Ordinal 或 OrdinalIgnoreCase 比较;面向用户的语言排序才使用明确文化规则。
错误选项辨析: A 项:ToLower 会产生新字符串,且某些文化下大小写映射与 Ordinal 不一致;C 项:== 与默认 Equals 对字符串采用 Ordinal 规则,并非文化规则;D 项:文化比较用于用户展示与排序,用于标识符可能产生意外的等价关系。
013 关于 C# 字符串不可变性,哪种表述准确?
难度: 基础
- A. 循环拼接与 StringBuilder 的分配成本完全相同
- B. 字符串变量可以重新赋值,说明字符串内容是可变的
- C. string.Replace 等操作会原地修改原字符串
- D. 字符串修改操作返回新实例或复用已有实例,原实例不变;循环拼接可能产生大量中间分配
查看答案与解析
正确答案D
正确原因: 字符串修改操作返回新实例或复用已有实例;循环拼接可能产生大量中间分配。
错误选项辨析: A 项:循环 += 每次生成新字符串,中间分配远多于 StringBuilder;B 项:变量重绑定不等于内容可变,原字符串对象仍不可变;C 项:Replace 返回新字符串,原实例不会被修改。
014 在循环中拼接大量未知数量的字符串片段,应选择哪种方式?
难度: 进阶
- A. 未知次数的循环拼接优先使用 StringBuilder;少量固定片段直接插值通常更清晰
- B. 任何字符串连接都必须使用 StringBuilder
- C. 循环中使用 += 与 StringBuilder 一样是 O(n) 总成本,无需区分
- D. 字符串插值会产生编译错误,只能使用 StringBuilder
查看答案与解析
正确答案A
正确原因: 未知次数的循环拼接适合使用 StringBuilder;少量固定片段直接插值通常更清晰。
错误选项辨析: B 项:少量固定片段用插值更清晰,不应教条化;C 项:字符串不可变使 += 每次复制已有内容,总成本为 O(n²);D 项:插值是合法的 C# 语法,只是不适合超长循环拼接。
015 实现“回文串”判断前,必须先明确什么?
难度: 进阶
- A. 先 ToLower 再比较一定正确且无分配
- B. 必须明确是否忽略大小写、空格与符号,以及是否做 Unicode 规范化;不同契约会改变合法字符的提取与比较方式
- C. 反转原字符串即可覆盖所有回文定义
- D. 回文判断与字符集无关,任何输入都可以直接比较
查看答案与解析
正确答案B
正确原因: 编码前必须明确是否忽略符号、大小写和 Unicode 规范化;不同契约会改变合法字符提取与比较方式。
错误选项辨析: A 项:ToLower 有分配,且只覆盖大小写,不覆盖符号与规范化;C 项:反转只解决顺序判断,不处理大小写、符号与规范化契约;D 项:Unicode 组合字符与大小写会使直接比较在特定契约下出错。