C++每日一练之题目名称:合并序列(Python和C++)

文章讲述了作者在练习C++编程时遇到的关于合并序列的问题。题目要求按字典序输出以特定字符串T为前缀的所有单词。作者首先提供了可能存在问题的C++代码,然后分析了代码中的逻辑错误,并尝试用Python编写了更简洁的版本。尽管C++代码在本地环境能运行,但在某些在线编译器中无法通过,作者还咨询了GPT4,但未得到问题的解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本想着再练练C++,每日一练挺好玩的,可今天尽折腾这简单的题目了!请看我仔细分说折腾过程。


一、题目:合并序列

题目描述:
有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词。

输入描述:
输入文件第一行包含一个正整数N; 接下来N行,每行一个单词,长度不超过100; 最后一行包含字符串T。 所有字符均为小写字母。

输出描述:
按字典序升序输出答案。

二、过程

1、So easy:

代码如下(C++):

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>

using namespace std;
vector<string> solution(int N, vector<string>& vec, string T){
    vector<string> result={};
    // TODO:
    sort(vec.begin(), vec.end());
    for(int i=0; i<N; ++i){
        if (vec[i][0]==T[0] && ((int) vec[i].find(T))!=-1){
            result.push_back(vec[i]);
        } 
    }
    return result;
}

2、代码分析

这里很容易犯一个错误,根据示例来看,会误以为T是一个字符,事实上它可能是多个字符,所以就会不能满分通过。

在以上代码中,用了T[0]来检测是否以字符串T开头的,再以find(T)是否等于-1来判断字符串是否包含。明显会有问题,因为很可能存在第一个字符和T的第一个字符相同的情况。应该改用find(T, 0),然后确认返回值是否为0。从代码来看,虽然逻辑略有问题,但应该能正常运行才对,最多不能满分。自测报错如图:

在这里插入图片描述
编程界面执行不通过,为0% 但不报错!好吧,我换python3试试~

在这里插入图片描述
这里python的逻辑比上面C++的逻辑清晰多了,直接判断是否以T开头,t是T字符串的长度,[:t]自然就是从开始到 t 个字符串。这里两个切片操作写得有点啰嗦,直接for x in arr 会更方便点,这是从C++带来的毛病,C++写下标循环更多些。

回过头来研究一下优快云的C++就不让我过编译!我用本地环境C++测试一下,VSCODE, C++17 编译器g++:
在这里插入图片描述
至少也是能出结果的嘛~,对不对另说是吧。这个代码和前面C++是一样的。明显本地环境是可以通过的,为什么网页编译器不让过真是找不到原因了。

3、请AI帮忙

AI这么厉害,我请教GPT4去试试,下面把我的代码拿去给GPT4检查:

在这里插入图片描述
我把C++代码传给chat-GPT检查了,GPT给的回复是看不出任何错误,它也没发现逻辑上的问题,证明GPT的逻辑能力也是很有限的,暂时还是不用担心大模型AI来抢咱码农兄弟的饭碗哈~


总结

这里留着C++的解法,主要是为了哪天说不定就想通了,为什么这么写不能过编译。C++的语法是极复杂的,虽然它很强大、应用范围很广,几乎能用于任何方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无证的攻城狮

如本文对您有用,大爷给打个赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值