今天以一道最长字符前缀匹配为例来批判一下自己的代码水平。
题目描述:
给定n个字符串,求它们的公共前缀。
输入描述:
第一行为一个正整数n(2≤n≤20),表示字符串的个数。
接下来n行,每行一个字符串(仅由大小写字母组成),每个字符串的长度不超过50。
输出描述:
输出n个字符串的公共前缀。如果没有公共前缀,那么输出空行。
样例
输入
3
actrpg
actfps
actarpg
输出
act
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=256;
char arr[MAXN][MAXN];
int main(){
int i=0;
int length=0;
int minL=MAXN;
cin>>length;
getchar();
for(i=0;i<length;i++){
cin.getline(arr[i],MAXN);
minL=min(minL,(int)strlen(arr[i]));
}
bool jump=true;
for(i=0;i<minL;i++){
for(int j=1;j<length;j++){
if(arr[0][i]!=arr[j][i]){
jump=false;
break;
}
}
if(jump){
cout<<arr[0][i];
}
else break;
}
cout<<endl;
return 0;
}
第一次修改:修改录入str方式(次要问题)
getchar()吞掉换行符
cin.getline()将str录入字符串数组
第二次修改:修改循环判断中的参数(严重问题)
1. 使用while循环,将录入的length进行自减,导致后来的for循环使用length的值为0;
2. 嵌套两个for循环判断前缀时,没有确定好判断条件;将length作为条件。。。
第三次修改:加入minL来存放录入str的最短长度,用于之后的循环判断条件。
总结:
首先暴露出来的问题是,代码思路不顺,尤其是重要的判断部分没有想清楚就下笔,导致后来先入为主的印象和蜜汁自信。
其次是判断条件中的参数被滥用,导致信息丢失,之后还是沿用i、j。