C#实现字符串重复字符仅保留一次的问题求助
问题分析与修复
你的代码核心问题有两个:
- 逻辑判断完全搞反:你写的
word.Split(word[i]).Length - 1 > 1 ? ' ' : word[i],意思是字符出现次数大于1时替换为空格,仅出现1次时才保留字符,这和你“重复字符仅显示一次”的需求完全相反。 - 未做去重标记:遍历每个字符时,哪怕已经添加过该字符,仍会重复处理,导致最终结果可能出现重复(如果字符仅出现1次的话)。
另外用Split统计字符出现次数的方式效率极低,不推荐使用。
修复方案
方案1:使用HashSet(高效直观)
用HashSet记录已经处理过的字符,遍历字符串时只保留首次出现的字符:
static void Main(string[] args) { string word = "Hello World!"; Console.WriteLine(encode(word)); } static string encode(string word) { string result = ""; var seenChars = new HashSet<char>(); word = word.ToLower(); foreach (char c in word) { if (!seenChars.Contains(c)) { seenChars.Add(c); result += c; } } return result; }
测试输入"aaabbbccc"会输出"abc",输入"Hello World!"会输出"helo wrd!"。
方案2:使用LINQ(简洁一行搞定)
利用LINQ的Distinct()方法直接获取唯一字符序列:
static void Main(string[] args) { string word = "Hello World!"; Console.WriteLine(encode(word)); } static string encode(string word) { return new string(word.ToLower().Distinct().ToArray()); }
这个方法逻辑和方案1一致,只是用LINQ简化了代码,效果完全相同。
内容的提问来源于stack exchange,提问作者enl1ghtenment
相关产品推荐
相关产品推荐

