如何使用C#从字符串中删除序列中重复/相同的字符?

时间:2019-12-27 05:49:11

标签: c# string sequence

我有一个字符串:

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);

这也是我在答案部分中添加的解决方案,可以通过检查答案的时间戳在下面进行验证。

5 个答案:

答案 0 :(得分:2)

根据我的理解,您只想消除重复的仅在连续的序列中。您可以使用以下方法实现它

使用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

答案 1 :(得分:2)

我认为这是测试任务的结果,在这些任务中,您只能使用任何.NET“方便”功能来表达自己的想法。

好的,这是使用“简单”语言的方法:

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];
    }
}

答案 2 :(得分:1)

public static string RemoveDuplicates(string input)
{
    return new string(input.Distinct().ToArray());
}

答案 3 :(得分:0)

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 是输出。

答案 4 :(得分:-1)

这是我提出的解决方案!

        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);