我必须解决这个问题,其中给定一个字符串,我必须返回字符串中存在的第一个非重复字符。
我使用hashtable解决了它并编写了一个方法,该方法对字符串进行常量引用并返回第一个非重复字符。但是,当字符串中没有非重复字符时,我返回-1并在主程序中检查如下
char c = firstNonRepeating( word );
if (static_cast<int> (c) == -1)
cout<<"no non repeating character present\n";
else
cout<<c<<endl;
是否存在所需字符时返回-1的正确方法?
答案 0 :(得分:2)
您return
只需0
即可。因为逻辑上,在任何情况下0
都是任何以空字符结尾的字符串中的第一个非重复字符!
我认为返回-1
容易出错,因为您对int
进行投射,而且255
也是有效字符。
答案 1 :(得分:1)
这可能是一种风格问题,但我宁愿选择以下内容:
char c;
bool result = getFirstNonRepeating(word, c);
if (result)
cout << "no non repeating character present\n";
else
cout << c << endl;
如果c
返回getFirstNonRepeating
,则未指定调用后false
的值。
这样,返回值与操作的结果(或失败)之间不存在歧义,即使对于getFirstNonRepeating
或'\0'
字符,0xFF
函数也可以正常工作你需要改变逻辑。
答案 2 :(得分:0)
还有一个选项:为了更类似于STL算法,你可以将迭代器返回到第一个非重复字符,如果它不存在,只需返回string.end()。
答案 3 :(得分:0)
我已经使用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);
}