lsmCC 发表于 2023-10-12 15:34:12

牛客alan题

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,t=0;
    string s;
    cin>>n;
    for(int i=0;i<n;i++)
    {
      cin>>s;
    }
    for(int i=0;i<s.size();i++)
    {
      s=tolower(s);
      if(s.find("alan")!=-1);
      t++;
    }
    cout<<t<<endl;
}
题目链接:https://ac.nowcoder.com/acm/contest/19306/1040
求修改代码使能ac,不知道错在了哪里,竟然是答案的两倍,还有可以细说一下find函数在c++的用法吗?比如t=
s.find("bob")时,为什么输出的t=0呢

isdkz 发表于 2023-10-12 15:35:02

这道题目的问题在于第二个for循环中的语句块没有被正确的限定在if语句中,导致每次循环都会执行一遍,从而计数器t的值被重复累加。正确的代码应该是这样的:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,t=0;
    string s;
    cin>>n;
    for(int i=0;i<n;i++)
    {
      cin>>s;
      for(int j=0;j<s.size();j++) // 遍历字符串s
      {
            s=tolower(s); // 将字符转为小写
      }
      if(s.find("alan")!=-1) // 判断字符串是否包含"alan"
      {
            t++;
      }
    }
    cout<<t<<endl;
}


关于find函数的用法,它的语法是这样的: s.find(str, pos) ,其中 s 是一个字符串, str 是要查找的子字符串, pos 是查找的起始位置。如果找到了子字符串,返回它在 s 中的起始位置,否则返回 string::npos 。在这道题目中,我们用 if(s.find("alan")!=-1) 来判断字符串 s 中是否包含"alan",如果包含,计数器 t 就加1。在这里, find 函数返回的是子字符串在 s 中的起始位置,如果返回的是 string::npos ,说明没找到,它的值为-1。因此,我们用 if(s.find("alan")!=-1) 来判断是否找到了"alan"。如果找到了,就执行 t++ ,计数器 t 就加1。如果没找到,就不执行 t++ ,计数器 t 保持不变。

至于为什么 t=s.find("bob") 时,输出的 t 值为0,这是因为 find 函数返回的是子字符串在 s 中的起始位置,如果子字符串是 s 的第一个字符,它的起始位置就是0。

陶远航 发表于 2023-10-12 15:35:10

首先,让我们来看一下你的代码。你的代码的主要问题在于你在检查每个字符是否为\"alan\"的时候,你增加了计数器t。这意味着,无论字符串中是否存在\"alan\",你都会增加t。这就是为什么你的答案是预期的两倍。

另外,你的代码只检查了最后一个输入的字符串是否包含\"alan\",而没有检查所有输入的字符串。你需要在每次输入一个新的字符串时就检查它是否包含\"alan\"。

以下是修改后的代码:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, t = 0;
    string s;
    cin >> n;
    for (int i = 0; i < n; i++) {
      cin >> s;
      for (int j = 0; j < s.size(); j++) {
            s = tolower(s);
      }
      if (s.find(\"alan\") != string::npos) {
            t++;
      }
    }
    cout << t << endl;
    return 0;
}


关于find函数的用法,find函数是C++中的一个字符串函数,用于在字符串中查找子串。如果找到子串,它会返回子串在字符串中首次出现的位置的索引;如果没有找到,它会返回一个特殊的值string::npos。

例如,当你执行t = s.find(\"bob\")时,如果字符串s中包含\"bob\",那么t将被设置为\"bob\"在s中首次出现的位置的索引。如果s中不包含\"bob\",那么t将被设置为string::npos。注意,字符串的索引是从0开始的,所以如果\"bob\"是s的开始部分,那么t将被设置为0。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 2023-10-12 15:36:17

问题分析:

这个代码有几个问题导致结果不正确:

1. 在输入循环中,虽然读取了字符串 s,但是并没有做任何操作,而是直接进入了下一次循环。这样会导致最后只处理了最后一次读取的字符串。

2. 第二个循环中,对字符串 s 的每个字符都进行了转换为小写的操作。然后使用 s.find("alan") 来查找 "alan" 是否在 s 中出现过。然而,这个判断条件放在了一个 if 语句的分号后面,这意味着无论 find() 的返回值是什么,都会执行 t++,从而导致计数错误。

3. find() 函数在 C++ 中的用法是查找子串的第一次出现位置。如果找到了子串,则返回它在原字符串中的起始位置。如果没有找到,则返回 string::npos(一个特殊的常量)。因此,当 find() 返回值为 0 时,意味着子串在原字符串的起始位置就是 0。所以,当 "bob" 在原字符串中的起始位置是 0 时,find() 的返回值就是 0。

修正代码如下:


#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, t = 0;
    string s;
    cin >> n;
   
    for (int i = 0; i < n; i++) {
      cin >> s;
      
      for (int j = 0; j < s.size(); j++) {
            s = tolower(s);
      }
      
      if (s.find("alan") != string::npos) {
            t++;
      }
    }
   
    cout << t << endl;
    return 0;
}


修正后的代码会对输入的每个字符串都进行处理,并且在判断子串是否出现时,通过比较返回值是否等于 string::npos 来确定是否找到了子串。

希望能帮助到你!如果还有疑问,请随时提出。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 牛客alan题