鱼C论坛

 找回密码
 立即注册
查看: 1009|回复: 3

牛客alan题

[复制链接]
发表于 2023-10-12 15:34:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[i]=tolower(s[i]);
        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呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[j]=tolower(s[j]); // 将字符转为小写
        }
        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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[j] = tolower(s[j]);
        }
        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
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[j] = tolower(s[j]);        }                if (s.find("alan") != string::npos) {            t++;        }    }        cout << t << endl;    return 0;}
修正后的代码会对输入的每个字符串都进行处理,并且在判断子串是否出现时,通过比较返回值是否等于 string::npos 来确定是否找到了子串。

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

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 07:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表