返回字符串中第一个不重复的字符

return first non repeating character in a string

本文关键字:字符 字符串 第一个 返回      更新时间:2023-10-16

我必须解决这个问题,在这个问题中,给定一个字符串,我必须返回字符串中的第一个不重复字符。

我使用hashtable解决了这个问题,并编写了一个方法,该方法对字符串进行常量引用,并返回第一个不重复的字符。然而,当字符串中没有非重复字符时,我返回-1,在主程序中,我检查如下

char c = firstNonRepeating( word );
if (static_cast<int> (c) == -1)
     cout<<"no non repeating character presentn";
else
     cout<<c<<endl;

当所需字符不存在时,这是返回-1的正确方法吗?

您可以简单地使用return0。因为从逻辑上讲,在任何情况下,0都是任何以nul结尾的字符串中的第一个不重复字符!

我认为返回-1很容易出错,因为您对int进行了强制转换,而且255也是一个有效字符。

这可能是一个风格问题,但我更喜欢这样的东西:

char c;
bool result = getFirstNonRepeating(word, c);
if (result)
     cout << "no non repeating character presentn";
else
     cout << c << endl;

其中,如果getFirstNonRepeating返回false,则未指定调用后c的值。

这样,返回值和操作的结果(或失败)之间就不会有歧义,如果您需要更改逻辑,则getFirstNonRepeating函数甚至可以用于''0xFF字符。

还有一个选项:为了更类似于STL算法,您可以将迭代器返回到第一个不重复的字符,如果没有迭代器,只需返回string.end()。

我已经使用HashMap来计算字符

FirstNonRepeating(String s){
HashMap<Character, Integer> count = new HashMap<Character, Integer>();
    int n = s.length();
    for (int i = 0; i < n; i++) {
        char c = s.charAt(i);
        count.put(c, count.getOrDefault(c, 0) + 1);
    }
    // find & print the index position 
    for (int i = 0; i < n; i++) {
        if (count.get(s.charAt(i)) == 1) 
            System.out.println(i); 
}