您的当前位置:首页正文

华为OJ(一)

2024-11-30 来源:个人技术集锦

1、字符串逆序输出
第一次尝试的代码:

#include<iostream>
#include<string>
using namespace std;
int main(){
    string inputString;
    //输入字符串
    cin>>inputString;

    int length,i;
    length = inputString.size();
    //改变字符串顺序
    char temp;
    for(i=0;i<length/2;i++){
        temp=inputString[i];
        inputString[i]=inputString[length-1-i];
        inputString[length-1-i]=temp;
    }
    cout<<inputString;
    return 0;
}

没有考虑到空格的存在。

#include<iostream>
#include<string>
using namespace std;
int main(){
    string inputString;
    cin>>inputString;
    cout<<inputString<<endl;
    return 0;
}

运行上述代码会发现输出如下:

第二次尝试的代码:

#include<iostream>
#include<string>
using namespace std;
int main(){
    char inputString[100];
    int length,i;

    //输入字符串
    gets(inputString);

    //得到字符串的长度
    for(i=0;;i++){
        if(inputString[i]=='\0'){
            length = i;
            break;
        }
    }

    //改变字符串顺序
    char temp;
    for(i=0;i<length/2;i++){
        temp=inputString[i];
        inputString[i]=inputString[length-1-i];
        inputString[length-1-i]=temp;
    }
    cout<<inputString;

    return 0;
}

终于正确了…

2、输出一句话中的最后一个单词
第一次尝试的代码:

#include<iostream>
#include<string>
using namespace std;
int main(){
    char str[128];
    int length,i;
    int seat;//最后一个空格的位置
    gets(str);

    for(i=0;;i++){
        if(str[i]==' '){
            seat=i;
        }
        if(str[i]=='\0'){
            length=i;break;
        }
    }

    cout<<length-seat-1;

    return 0;
}

没有考虑到只有一个单词的情况:
给seat一个初始值-1就可以了。

3、输出两个字符串中最大相同子串的长度
初次提交的代码:

#include<iostream>
#include<string>
using namespace std;

int getCommonStrLength(char *pFirstStr, char *pSecondStr){

    int i,j,lengthMax=0,lengthF,lengthS,length;

    //得到pFirstStr的长度,大写变小写
    for(i=0;;i++){
        if((int)pFirstStr[i]>=65 && (int)pFirstStr[i]<=90){
            pFirstStr[i]=(char)((int)pFirstStr[i]+32);
        }
        if(pFirstStr[i]=='\0'){
            lengthF=i;break;
        }
    }

    //得到pSecondStr的长度,大写变小写
    for(i=0;;i++){
        if((int)pSecondStr[i]>=65 && (int)pSecondStr[i]<=90){
            pSecondStr[i]=(char)((int)pSecondStr[i]+32);
        }
        if(pSecondStr[i]=='\0'){
            lengthS=i;break;
        }
    }

    for(i=0;i<lengthF;i++){ 
        for(j=0;j<lengthS;j++){
            if(pFirstStr[i]==pSecondStr[j]){
                length=1;
                i++;
                j++;
                while(i<lengthF && j<lengthS){
                    if(pFirstStr[i]==pSecondStr[j]){
                        length++; 
                    }else{
                    break;
                    }
                    i++;
                    j++;

                }
                if(length>lengthMax){
                    lengthMax=length;
                }
            }
        }
    }

    return lengthMax;

}

int main(){
/*
计算两个字符串的最大公共字串的长度,字符不区分大小写
*/
/*
解题思路:
取某个字符串的各个字符依次与另一个字符串的各个字符比较,如果相同则依次比较下一个
*/
    //输入要比较的字符串
    int lengthMax;
    char pFirstStr[100], char pSecondStr[100];
    cin>>pFirstStr;
    cin>>pSecondStr;

    lengthMax=getCommonStrLength(pFirstStr,pSecondStr);
    cout<<lengthMax;

    return 0;
}

出现了编译错误,系统提示原因可能如下:
1.答案中修改了接口;
2.上传了其他语言的答案;
3.使用了第三方类库。

还有要注意一点,在没有进行函数声明时,C语言在主函数中使用函数时,该函数要放在主函数的前面。

编译错误的原因是:
主函数的两个字符串定义错误,应该这样定义
char pFirstStr[100],pSecondStr[100];

奇怪的是在VC6.0中竟然可以编译通过。

4、统计字符串中大写字母的数量

#include<iostream>
#include<string>
using namespace std;

int CalcCapital(string str){
    int length = str.size();
    int i;
    int num=0;
    for(i=0;i<length;i++){
        if((int)str[i]>=65 && (int)str[i]<=90){
            num++;
        }
    }
    return num;
}

int main(){
    string str;
    int num=0;
    //cin>>str;//cin处理不了空格输入
    getline(cin,str);
    num=CalcCapital(str);
    cout<<num;
    return 0;
}

这里要注意的是不能用cin输入字符串,因为cin处理不了空格输入。

例如AA BB输入进去,得到的是2,str被中间的空格间断了,str被赋值为“AA”,所以输出的是2。

5、输入DNA序列和片段长度,输出DNA序列中GC比例最大的片段。

#include<iostream>
#include<string>
using namespace std;
int main(){
    string str;//DNA序列
    int n;//最小子串长度
    cin>>str>>n;
    double GC_Ratio,GC_maxRatio;//存放GC比例
    //问题出在double上,GCnum/n,int/int,且GCnum<n 所得到的结果都为0
    //其实这里不用这么麻烦,直接用GCnum就可以了
    int num_maxRatio=0;//记录序列的起点
    int GCnum=0;
    int i,j;
    for(i=0;i<str.size()-4;i++){
        for(j=i;j<i+5;j++){
            if(str[j]=='G' || str[j]=='C'){
                GCnum++;
            }
        }


        GC_Ratio = GCnum/n;
        if(j==0){
            GC_maxRatio = GC_Ratio;
            num_maxRatio = j; //j应该为i
        }
        if(GC_Ratio>GC_maxRatio){
            GC_maxRatio = GC_Ratio;
            num_maxRatio = j; //j应该为i
        }
        cout<<GC_Ratio<<endl;
        GCnum = 0;
    }

    //输出该段序列
    for(i=0;i<5;i++){
        cout<<str[num_maxRatio+i];
    }


    return 0;
}

上面的代码有问题,具体问题看注释。

还有另外一点要注意的是,这样的序列可能不止一段。
但是在华为OJ上的样例输入
输入:
AACTGTGCACGACCTGA
5
输出:GCACG
其实其中的另一段CGACC的GC比例也一样大,没有输出来。
所以猜测:如果有多个输出的话,那么是默认要输出第一段的。

还有一点要注意:要考虑输入的字符串长度小于n的情况。

修改后的代码:

#include<iostream>
#include<string>
using namespace std;
int main(){
    string str;//DNA序列
    int n;//最小子串长度
    cin>>str>>n;

    int num_maxRatio=0;//记录所要找的序列的起点
    int GCnum=0,GCmax=0;
    int i,j;
    if(n<=str.size()){
        for(i=0;i<str.size()-4;i++){
            for(j=i;j<i+5;j++){
                if(str[j]=='G' || str[j]=='C'){
                    GCnum++;
                }
            }
            if(i==0){
                GCmax = GCnum;
                num_maxRatio = i; //=i不是=j
            }
            if(GCnum>GCmax){
                GCmax = GCnum;
                num_maxRatio = i; //=i不是=j
            }
            GCnum = 0;
        }

        for(i=0;i<5;i++){
            cout<<str[num_maxRatio+i];
        }
    }

    return 0;
}

case1还是通不过

原来上面的代码都是针对n=5来写的…所以改成下面就好了

#include<iostream>
#include<string>
using namespace std;
int main(){
    string str;//DNA序列
    int n;//最小子串长度
    cin>>str>>n;

    int num_maxRatio=0;//记录所要找的序列的起点
    int GCnum=0,GCmax=0;
    int i,j;
    if(n<=str.size()){
        for(i=0;i<str.size()-(n-1);i++){
            for(j=i;j<i+n;j++){
                if(str[j]=='G' || str[j]=='C'){
                    GCnum++;
                }
            }
            if(i==0){
                GCmax = GCnum;
                num_maxRatio = i; //=i不是=j
            }
            if(GCnum>GCmax){
                GCmax = GCnum;
                num_maxRatio = i; //=i不是=j
            }
            GCnum = 0;
        }

        for(i=0;i<n;i++){
            cout<<str[num_maxRatio+i];
        }
    }

    return 0;
}
显示全文