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;
}