如何使用 C# 从字符串中删除序列中的 repeated\same 个字符?
How to remove repeated\same characters in a sequence from a string using C#?
我有一个字符串:
string input = "aaaabbcccghbcccciippppkkllk"
输出应该是:
abcghbcipklk
注意:必须使用循环或递归。等等
只是想知道有没有比这更好更高效的代码:
string input = "aaaabbcccghbcccciippppkkllk";
int j=0;
for (int i=0; i<input.Length - 1; i++) {
for(j=i+1; j<input.Length && input[i] == input[j]; j++);
input = input.Substring(0, i+1) + input.Substring(j);
}
Console.WriteLine(input);
根据我的理解,你想要消除重复只有在连续的序列中。您可以使用以下方法实现它
使用List<string>
var nonDuplicates = new List<char>();
foreach (var element in str.ToCharArray())
{
if(nonDuplicates.Count == 0 || nonDuplicates.Last() != element)
nonDuplicates.Add(element);
}
var result = new string(nonDuplicates.ToArray());
更新
参考来自 的评论,我更新了答案并提供了另外两个解决方案和 运行 它们的基准。结果如下所示。
使用字符串追加
var str = "aaaabbcccghbcccciippppkkllk";
var strResult = string.Empty;
foreach (var element in str.ToCharArray())
{
if (strResult.Length == 0 || strResult[strResult.Length - 1] != element)
strResult = $"{strResult}{element}";
}
使用 StringBuilder
var str = "aaaabbcccghbcccciippppkkllk";
var strResult = new StringBuilder();
foreach (var element in str.ToCharArray())
{
if (strResult.Length == 0 || strResult[strResult.Length - 1] != element)
strResult.Append(element);
}
var result = strResult.ToString();
基准测试结果
Method | Mean | Error | StdDev | Median |
------------------- |-----------:|----------:|-----------:|-----------:|
UsingList | 809.7 ns | 11.975 ns | 11.202 ns | 806.5 ns |
UsingStringAppend | 1,738.0 ns | 39.269 ns | 109.467 ns | 1,697.2 ns |
UsingStringBuilder | 201.6 ns | 1.960 ns | 1.834 ns | 201.1 ns |
如结果所示,与 List 相比,StrinbBuilder 方法要快得多。字符串追加方法最慢。
输入
aaaabbcccghbcccciippppkkllk
输出
abcghbcipklk
好的,下面是使用 "simple" 语言的方法:
string input = "aaaabbcccghbcccciippppkkllk"
var result = "" + input[0];
for(var i = 1; i < input.Length; i++)
{
if(input[i] != result[result.Length-1])
{
result += input[i];
}
}
string str = "abbxxcccxbaac";
string nstr = str[0].ToString();
for(int j = 0; j < str.Length - 1; j++)
{
if(!str[j].Equals(str[j + 1]))
{
nstr = nstr + str[j + 1];
}
}
它将从字符串中删除顺序字符。 nstr 是输出。
我有一个字符串:
string input = "aaaabbcccghbcccciippppkkllk"
输出应该是:
abcghbcipklk
注意:必须使用循环或递归。等等
只是想知道有没有比这更好更高效的代码:
string input = "aaaabbcccghbcccciippppkkllk";
int j=0;
for (int i=0; i<input.Length - 1; i++) {
for(j=i+1; j<input.Length && input[i] == input[j]; j++);
input = input.Substring(0, i+1) + input.Substring(j);
}
Console.WriteLine(input);
根据我的理解,你想要消除重复只有在连续的序列中。您可以使用以下方法实现它
使用List<string>
var nonDuplicates = new List<char>();
foreach (var element in str.ToCharArray())
{
if(nonDuplicates.Count == 0 || nonDuplicates.Last() != element)
nonDuplicates.Add(element);
}
var result = new string(nonDuplicates.ToArray());
更新
参考来自 的评论,我更新了答案并提供了另外两个解决方案和 运行 它们的基准。结果如下所示。
使用字符串追加
var str = "aaaabbcccghbcccciippppkkllk";
var strResult = string.Empty;
foreach (var element in str.ToCharArray())
{
if (strResult.Length == 0 || strResult[strResult.Length - 1] != element)
strResult = $"{strResult}{element}";
}
使用 StringBuilder
var str = "aaaabbcccghbcccciippppkkllk";
var strResult = new StringBuilder();
foreach (var element in str.ToCharArray())
{
if (strResult.Length == 0 || strResult[strResult.Length - 1] != element)
strResult.Append(element);
}
var result = strResult.ToString();
基准测试结果
Method | Mean | Error | StdDev | Median |
------------------- |-----------:|----------:|-----------:|-----------:|
UsingList | 809.7 ns | 11.975 ns | 11.202 ns | 806.5 ns |
UsingStringAppend | 1,738.0 ns | 39.269 ns | 109.467 ns | 1,697.2 ns |
UsingStringBuilder | 201.6 ns | 1.960 ns | 1.834 ns | 201.1 ns |
如结果所示,与 List 相比,StrinbBuilder 方法要快得多。字符串追加方法最慢。
输入
aaaabbcccghbcccciippppkkllk
输出
abcghbcipklk
好的,下面是使用 "simple" 语言的方法:
string input = "aaaabbcccghbcccciippppkkllk"
var result = "" + input[0];
for(var i = 1; i < input.Length; i++)
{
if(input[i] != result[result.Length-1])
{
result += input[i];
}
}
string str = "abbxxcccxbaac";
string nstr = str[0].ToString();
for(int j = 0; j < str.Length - 1; j++)
{
if(!str[j].Equals(str[j + 1]))
{
nstr = nstr + str[j + 1];
}
}
它将从字符串中删除顺序字符。 nstr 是输出。