一、整数反转

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