c#logic从字符串中获取第一个非重复(不同)字符

时间:2010-10-22 07:10:44

标签: c#

在c#中我想创建逻辑,如果我将一个类似abcabda的字符串传递给一个方法,那么它应该从字符串中返回第一个非重复字符,就像在上面它应该返回c一样。 我无法将字符串转换为字符数组,然后如何将每个数组字符与字符串进行比较并返回第一个非重复字符。

我可以这样做吗?

class A
{
    static void main()
    {
        A a=new A();
        char  ch=a.m1(abcabd);
    }
}

class B
{
    char m1(string s)
    {
        string s1=s;
        char[] ch1=new char[s.length];
        for(int x=0; x<s.length;x++)
        {
            ch1[x]=s[x];
        }
        for(int x=0; x<s.length; x++)
        {
            for(int y=0; y<s.lenth; y++)
            {
                if(s[x]=ch1[y])
                {             
/// here i am confused how to create logic for comparison please let me know
// and how to return the character
                }
            }
        }
    }
}

15 个答案:

答案 0 :(得分:19)

您似乎正在寻找字符串中的第一个字符,其计数等于1?

using System.Linq;
string str = "abcabda";
char result = str.FirstOrDefault(ch => str.IndexOf(ch) == str.LastIndexOf(ch));

非LINQ版本:

    for (int index = 0; index < str.Length; index++)
    {
        if (str.LastIndexOf(str[index]) == str.IndexOf(str[index]))
        {
            result = str[index];
            break;
        }
    }

答案 1 :(得分:5)

如何使用LINQ?

string test = "abcabda";

var selectedChars = (from c in test.ToCharArray() 
                    group c by c into groups
                    where groups.Count() == 1
                    select groups).First();

这将根据问题中给出的示例返回“c”。

答案 2 :(得分:5)

非常简单但是:

    private char? findNonRepeat(string search)
    {
        foreach(char chr in search)
        {
            if (search.LastIndexOf(chr) == search.IndexOf(chr))
                return chr;
        }

        return null;
    }

答案 3 :(得分:5)

您可以使用一点LINQ:

char result = input
    .GroupBy(c => c)             // group the characters
    .Where(g => g.Count() == 1)  // filter out groups with only 1 occurence
    .Select(g => g.Key)          // get the character from each remaining group
    .First();                    // return the first one

答案 4 :(得分:3)

我认为你需要在字符列表中循环两次:

  1. 一旦构建Dictionary<char, int>字符数,
  2. 然后查找字符串中计数等于1的第一个字符

答案 5 :(得分:3)

到目前为止,这是您的代码:

char m1(string s) 
{ 
    string s1=s; 
    char[] ch1=new char[s.length]; 
    for(int x=0; x<s.length;x++) 
    { 
        ch1[x]=s[x]; 
    } 
    for(int x=0; x<s.length; x++) 
    { 
        for(int y=0; y<s.lenth; y++) 
        { 
            if(s[x]=ch1[y]) 
            {              
/// here i am confused how to create logic for comparison please let me know 
// and how to return the character 
            } 
        } 
    } 
} 

你其实非常接近。我将忽略所有的风格问题和冗余,因为它们不是你所要求的。

你真正想要做的是逐字逐句地逐字逐句地查看字符串中是否存在该字符。如果角色重复,你可以停止寻找并继续下一个角色。如果你到达字符串的末尾而没有找到重复,你发现了一个非重复的字符并且可以返回它。嵌套的x / y循环中有大部分逻辑,但缺少一些东西:

    for(int x=0; x<s.length; x++) 
    {
        // you need a flag here to indicate whether your character is a duplicate
        for(int y=0; y<s.lenth; y++) // this loop should start at x+1, not 0
        { 
            if(s[x]=ch1[y]) // you need == instead of =
            {              
                // if you've gotten here, you have a duplicate --
                // set your flag to true and break out of the loop
            }
        }
        // at this point you should check your flag and
        // if it's not set, return your character: s[x]
    }

编辑:你提到你希望能够在不调用Length的情况下找到字符串的长度,并且可能没有命名任何其他方法。这样做的方法是使用foreach循环迭代字符串中的字符,随时递增计数器。以下是一些注释代码供您填写:

// initialize counter to 0
foreach (char ch in s)
{
    // increment counter by 1
}
// now counter is the length of the string

答案 6 :(得分:2)

“string”.ToCharArray()会给你一个包含“string”字符的数组

答案 7 :(得分:2)

这可能不是最有效的,但它有效且易于阅读:

    public string FirstNonRepeatingChar(string inString)
    {
        var array = inString.ToCharArray();
        foreach (char distinctChar in array.Distinct())
        {
            if (array.Count(x => x == distinctChar) == 1)
                return distinctChar.ToString();
        }
        return null; //none
    }

答案 8 :(得分:2)

这是我的解决方案

    public static char FirstNonRepeatedChar(string input)
    {
        bool isDuplicate;
        for (int i = 0; i < input.Length; i++)
        {
             isDuplicate = false;

            for (int j = 0; j < input.Length; j++)
            {
                if ((input[i] == input[j]) && i !=j )
                {
                    isDuplicate = true;
                    break;
                }

            }
            if (!isDuplicate)
            {
                return input[i];
            }

        }
        return default(char);

    }

答案 9 :(得分:1)

读取字符串中的每个字符都很简单:

foreach (Char character in myString)
{

}

答案 10 :(得分:1)

一种可能的解决方案: 从右到左从字符串中取出每个字符。 对于每个字符,检查字符串中字符的任何其他出现。 如果字符串中没有其他char出现,请将其添加到堆栈中。 一旦你对字符串中的所有字符执行了此操作,堆栈的顶部将包含第一个非重复字符。

答案 11 :(得分:1)

在字符串c#

中找到第一个非重复字符的三种方法

找到下面的代码 -

public char firstNonRepetitive(string inputString)
{
 int nextOccurrence = 0;
 char firstDistinctChar = ' ';
 for (int i = 0; i < inputString.Length; i++)
 {
    nextOccurrence = 0;
    for (int j = (i + 1); j < inputString.Length; j++)
    {
        if (inputString[i] == inputString[j])
            nextOccurrence++;
    }
    if (nextOccurrence == 0)
    {
        firstDistinctChar = inputString[i];
        break;
    }
  }
  return firstDistinctChar;

}

查看另外两种方式 -

program to find first non repeating character in a string c# - three ways

答案 12 :(得分:0)

这是针对此问题的O(n)解决方案。

public static char FirstNonRepeatedChar(string inputString)
    {
        if (String.IsNullOrEmpty(inputString))
            return '\0';
        if (inputString.Length == 1)
            return inputString[0];

        Hashtable charTable = new Hashtable();
        for (int i = 0; i <= (inputString.Length - 1); i++)
        {
            if (charTable.Contains(inputString[i]))
            {
                int currentCount = Int16.Parse(charTable[inputString[i]].ToString());
                charTable[inputString[i]] = currentCount + 1;
            }
            else
                charTable.Add(inputString[i], 1);
        }
        for (int i = 0; i <= (inputString.Length - 1); i++)
        {
            if (charTable[inputString[i]].ToString() == "1")
            {
                return char.Parse(inputString[i].ToString());
            }
        }
        return '\0';
    }

答案 13 :(得分:0)

这是从字符串中获取第一个非重复字符的简单逻辑

示例:AABBCCdEEfGG,这里第一个没有重复的字符是“d”

namespace PurushLogics
{
    class Purush_FirstNonRepeatingChar
    {
        public static void Main()
        {
            string inputString = "AABBCCdEEfGG";
            int i = 0;
            char[] a = inputString.ToCharArray();
            bool repeat = false;
            for (i = 0; i < a.Length; )
            {

                for (int j = i + 1; j < a.Length; )
                {
                    if (a[i] == a[j])
                    {
                        a = a.Where(w => w != a[i]).ToArray(); // Will return the array removing/deleting the character that is in a[i] location
                        repeat = true;
                        break;
                    }
                    else
                    {

                        repeat = false;
                    }

                    break;
                }

                if (repeat == false || a.Length == 1)
                {
                    break;
                }
            }
            Console.WriteLine(a[i]);
            Console.ReadKey();
        }
    }
}

答案 14 :(得分:0)

时间复杂度O(n)解决方案:

<button class="specialAttack" :disabled="sDisabled" @click="specialAttack(); testing()">Special Attack {{ sTimer }}</button>

单元测试用例的解决方案:

GitHub: solution with unit test