前言
本想着再练练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++的语法是极复杂的,虽然它很强大、应用范围很广,几乎能用于任何方向。