传智决赛题目与小结

一、整数反转

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的使用还不够熟悉。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,268评论 0 4
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,298评论 0 3
  • JavaScript语言精粹 前言 约定:=> 表示参考相关文章或书籍; JS是JavaScript的缩写。 本书...
    微笑的AK47阅读 590评论 0 3
  • 初秋的低吟声里,我们相遇在井大。 怀揣梦想,齐聚一堂 从一无所知到熟稔于心, 我们以心交心,换取真心。 ...
    白日末阅读 635评论 0 0
  • 比文招亲*燕返目录 还是阿板腿快,忙扭动壮硕短腿靠近神兽。 说来也怪,这神兽就是死死叼着那枚手戒不松口。 周五看到...
    惊鸿独舞阅读 561评论 12 17