C++复习炒剩饭(2)龙戏珠

今天以一道最长字符前缀匹配为例来批判一下自己的代码水平。

题目描述:

给定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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值