【问题标题】:return first non repeating character in a string返回字符串中的第一个非重复字符
【发布时间】:2020-04-27 06:13:00
【问题描述】:

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

我使用哈希表解决了这个问题,并编写了一个方法,该方法采用对字符串的常量引用并返回第一个非重复字符。但是,当字符串中不存在非重复字符时,我返回 -1 并在主程序中检查如下

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

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

【问题讨论】:

    标签: c++ algorithm


    【解决方案1】:

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

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

    【讨论】:

    • 字符串不一定是空终止的……那只是表示字符串结尾的一种 c 方式
    • @Amm Sokun,但在你的逻辑中,你只会检查字符串直到 null .. 正确。所以在这种情况下,这是一个有效的想法。如果您检查字符数组的大小,那么您可以争论,但您在问题中提到了string
    【解决方案2】:

    这可能是风格问题,但我宁愿选择类似的东西:

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

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

    这样,返回值和操作结果(或失败)之间没有歧义,如果您需要更改 getFirstNonRepeating 函数,即使是 '\0'0xFF 字符也可以工作逻辑。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我用过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); 
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-25
          • 2021-09-15
          • 1970-01-01
          • 2020-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多