-5

这个函数应该返回一个单次出现的大写字母。

我试图找出一个错误 30 分钟,但我真的不知道问题出在哪里。有人可以看看这个吗?

#include <algorithm>
#include <string>

using namespace std;

char singleOccurrence(string str) {
    transform(str.begin(), str.end(), str.begin(), ::toupper);
    sort(str.begin(), str.end());
    for(int i=0; i<str.length(); i++) {
        if(i==str.length()-1)
            return str[i];
        else if(str[i] != str[i+1])
            return str[i];
    }
}

int main()
{
   string str = "ala";
   cout << singleOccurrence(str);
}
4

2 回答 2

2

这个 if-else 语句

    if(i==str.length()-1)
    {
      return str[i];
    }
    else
      if(str[i] != str[i+1])
      {
        return str[i];
      } 

没有意义。

例如考虑 string s = "aab"。因为s[1] != s[2]您的函数将返回该字母'a',尽管它多次出现在字符串中。

或者考虑另一个字符串示例,例如"aaa". 在这种情况下,您的函数将再次返回 letter 'a'

如果您想使用一种对字符序列进行排序的方法,那么您可以在函数中使用例如标准容器std::map<char, size_t>而不对传递的字符串本身进行排序。

否则,您可以对原始字符串使用嵌套的 for 循环。

在这两种情况下,函数都应该声明为

char singleOccurrence( const std::string &str );

或者

char singleOccurrence( std::string_view str );

例如,如果在字符串中没有这样的字符,则可以返回字符'\0'

于 2021-06-08T18:24:40.353 回答
0
if(i==str.length()-1)
    {
      return str[i];
    }
    else
      if(str[i] != str[i+1])
      {
        return str[i];
      } 
  }

在“else”语句之后,您应该加上“{”,如果这可能是一个问题,请确认。其次,如果没有返回不同的东西,在这两种情况下你都会返回 str[i]。第三,我没有看到包含 iostream 库,如果您想使用 cout 或 cin(用于从输入读取),请不要忘记包含。您也可以在 main 中调用此函数一次,它总是会在对字母进行排序后给您第一个字母。你可以尝试使用map,它是在地图库中用STL实现的。在地图中,您可以将该字符串中的字母作为键,键值将是出现的次数。

#include <algorithm>
#include <iostream>
#include <string>
#include <map>

using namespace std;
// char singleOccurrence(string str)
// {
//   transform(str.begin(), str.end(), str.begin(), ::toupper);
//     sort(str.begin(), str.end());
//       for(int i=0; i<str.length(); i++)
//       {
//         if(i==str.length()-1)
//         {
//           return str[i];
//         }
//         else
//           if(str[i] != str[i+1])
//           {
//             return str[i];
//           } 
//       }
// }


int main()
{
   map<char, int> occurrences;//declare a map, your key will be a char and you key value an int
   string str="ala";
   for(int i = 0; i < str.length(); i++){
    occurrences[str[i]]++;
   }
   for(auto n : occurrences){
    cout<<n.first<<" "<<n.second<<endl;//n will be an iterator, you use iterators to get map values 
   }//if you want to check the number and show only the letter with a single occurrence just add an if statement and check in key value (n.second) is equal to one
}

我希望这有帮助!:)

于 2021-06-08T20:39:24.333 回答