美文网首页
传智决赛题目与小结

传智决赛题目与小结

作者: Ell1ot | 来源:发表于2019-10-08 22:40 被阅读0次
一、整数反转

1.先提取符号,再进行反转
2.用long long类型储存32为有符号整数,因为在反转时可能出现超界。
3.使用2<<30或1<<31表示2^32,int类型的取值范围为1<<31到(1<<31)-1。

#include<iostream>
using namespace std;
int main(){
    int n,sign=1; 
    cin>>n;
    long long n2=n;
    if(n2<0){               //去符号 
        sign=-1;
        n2*=-1;
    }
    long long ans=0;        //用long long处理数值,方便之后判定超界 
    while(n2>0){
        ans=ans*10+n2%10;
        n2/=10;
    }
    if(sign==-1) ans*=-1;   //还原符号 
    if(ans>=-1<<31&&ans<=1<<31-1) cout<<ans;
    else cout<<0;
} 
二、菱形图案

使用函数处理打印部分可以简化程序。

#include<iostream>
using namespace std;
void print(int x,int y){
    while(x--) cout<<' ';
    while(y--) cout<<'*';
    cout<<endl;
}
int main(){
    int n;cin>>n;
    for(int i=1;i<=n/2;i++) print(n/2-i+1,i*2-1);
    print(0,n);
    for(int i=n/2;i>=1;i--) print(n/2-i+1,i*2-1);
}
三、密钥格式化

使用两次栈对字符串进行处理,第一次过滤符号并转换字母,第二次按照要求添加符号。

#include<iostream>
#include<stack>
using namespace std;
int main(){
    string s;int k;
    cin>>s>>k;
    stack<char> s1,s2;
    for(int i=0;i<s.size();i++)  //第一步处理 
        if(s[i]!='-'){
            if(s[i]<='z'&&s[i]>='a') s[i]=s[i]-'a'+'A';
            s1.push(s[i]);
        }
    while(!s1.empty()){         //第二步处理 
        for(int i=1;i<=k;i++){
            if(s1.empty()) break;
            s2.push(s1.top());
            s1.pop();
        }
        if(!s1.empty()) s2.push('-');
    }
    while(!s2.empty()){         //输出 
        cout<<s2.top();
        s2.pop();
    }
}
四、三数之和

未完成的原因是:1.不会输入不定长数组。2.使用sort函数处理二维数组时语法错误。3.没有想到处理重复输出的合适方法。
首先将输入数组进行排序,排序后的数组在处理后仍然保持顺序,以满足输出要求。随后用三重循环对所有情况进行遍历,再用双重循环去除重复的答案。最后按照格式进行输出。应该有更快捷的解法。

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int num[100],n=0;
    int ans[100][3],ind=0;
    
    do{
        cin>>num[n++];
    }while(getchar()!='\n');
    sort(num,num+n);

    for(int i=0;i<n;i++)
        for(int j=i+1;j<n;j++)
            for(int k=j+1;k<n;k++)
                if(num[i]+num[j]+num[k]==0){
                    ans[ind][0]=num[i];
                    ans[ind][1]=num[j];
                    ans[ind][2]=num[k];
                    ind++;
                }
    
    for(int i=0;i<ind;i++)
        for(int j=i+1;j<ind;j++)
            if(ans[i][0]==ans[j][0]&&
               ans[i][1]==ans[j][1]&&
               ans[i][2]==ans[j][2]){
                ans[i][0]=-1;
                ans[i][1]=-1;
                ans[i][2]=-1;
                break;
            }
        
    cout<<'['<<endl;
    for(int i=0;i<ind;i++){
        if(ans[i][0]==-1&&ans[i][1]==-1&&ans[i][2]==-1)
            continue;
        else{
            cout<<'['<<ans[i][0]<<','<<ans[i][1]<<','<<ans[i][2]<<']';
            if(i!=ind-1) cout<<',';
            cout<<endl;
        }
    }
    cout<<']';
}
五、无重复字符的最长字串

双重循环遍历,建立字典判断字符是否出现。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main(){
    string s;
    cin>>s;
    int maxn=0,maxn2,ind;
    int a[150];
    for(int i=0;i<s.size();i++){
        memset(a,0,sizeof(a));
        ind=i;maxn2=0;
        while(!a[s[ind]]&&ind<s.size()){
            a[s[ind++]]=1;
            maxn2++;
        }
        maxn=max(maxn,maxn2);
    }
    cout<<maxn;
}
总结

仔细看,题目没有那么难。编码时注意细节,但是开始的思考时不要太纠结在细节。慢慢读题目的描述。
对STL的使用还不够熟悉。

相关文章

网友评论

      本文标题:传智决赛题目与小结

      本文链接:https://www.haomeiwen.com/subject/fkzvpctx.html