搜狐9.13软件开发 编程题
1题
兄弟串
通过交换两个字符能得到的串称为兄弟串,判断两个字符串是否为兄弟串
AC
思路:判断两个字符串中相同位值不同的个数,将相应位置为*,若=2,则符合要求,
若!=2,则排序,若存在至少两个不为*的相同字符,则也符合要求
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b;
while(cin>>a>>b){
int count = 0;
bool flg = false;
if(a.size()!=b.size())
cout<<0<<endl;
else{
for(int i = 0;i<a.size();i++){
if(a[i]!=b[i]){
count++;
a[i] = '*';
b[i] = '*';
}
}
if(count==2)
flg = true;
else{
sort(a.begin(),a.end());
sort(b.begin(),b.end());
for(int i = 0;i<a.size()-1;i++){
if(a[i]==a[i+1]&&a[i]!='*'){
flg = true;
break;
}
}
}
if(flg)
cout<<1<<endl;
else
cout<<0<<endl;
}
}
system("pause");
return 0;
}
2题
计算移动次数
无限长的x轴,从坐标0开始,每次向左或向右移动,第n次移动就移动n
问移动到目的点的最少移动次数
AC
思路:1~k最大可以得到(1+k)*k/2;将n转为正数,因为n与-n的次数相同,只是镜像取正负;
使得(1+k)*k/2>=n,则(1+k)*k/2-n得到的是小于(1+k)*k/2的正数,若减完后是偶数x,
则可以通过调整1~k中若干个数ai+aj+ak+al....=x/2,将相应的+号转为-号,即可实现将结果-x,
也就是最小的移动次数
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin>>n){
int pos = 0;
if(n<0)
n = -n;
for(int i = 0;i<n+5;i++){
int temp = (1+i)*i/2;
if(temp>=n&&(temp-n)%2==0){ //temp>=n且减数为偶数
pos = i;
break;
}
}
cout<<pos<<endl;
}
system("pause");
return 0;
}
3题
比较版本号大小
判断两个版本号大小
AC
思路:将版本号补齐,直接比较字符串的大小
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b;
while(cin>>a>>b){
if(a.size()==1)
a+=".0.0.0";
else if(a.size()==3)
a+=".0.0";
else if(a.size()==5)
a+=".0";
if(b.size()==1)
b+=".0.0.0";
else if(b.size()==3)
b+=".0.0";
else if(b.size()==5)
b+=".0";
bool flg = a>b;
if(flg)
cout<<1<<endl;
else if(a==b)
cout<<0<<endl;
else
cout<<-1<<endl;
}
system("pause");
return 0;
}
#搜狐#
兄弟串
通过交换两个字符能得到的串称为兄弟串,判断两个字符串是否为兄弟串
AC
思路:判断两个字符串中相同位值不同的个数,将相应位置为*,若=2,则符合要求,
若!=2,则排序,若存在至少两个不为*的相同字符,则也符合要求
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b;
while(cin>>a>>b){
int count = 0;
bool flg = false;
if(a.size()!=b.size())
cout<<0<<endl;
else{
for(int i = 0;i<a.size();i++){
if(a[i]!=b[i]){
count++;
a[i] = '*';
b[i] = '*';
}
}
if(count==2)
flg = true;
else{
sort(a.begin(),a.end());
sort(b.begin(),b.end());
for(int i = 0;i<a.size()-1;i++){
if(a[i]==a[i+1]&&a[i]!='*'){
flg = true;
break;
}
}
}
if(flg)
cout<<1<<endl;
else
cout<<0<<endl;
}
}
system("pause");
return 0;
}
2题
计算移动次数
无限长的x轴,从坐标0开始,每次向左或向右移动,第n次移动就移动n
问移动到目的点的最少移动次数
AC
思路:1~k最大可以得到(1+k)*k/2;将n转为正数,因为n与-n的次数相同,只是镜像取正负;
使得(1+k)*k/2>=n,则(1+k)*k/2-n得到的是小于(1+k)*k/2的正数,若减完后是偶数x,
则可以通过调整1~k中若干个数ai+aj+ak+al....=x/2,将相应的+号转为-号,即可实现将结果-x,
也就是最小的移动次数
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin>>n){
int pos = 0;
if(n<0)
n = -n;
for(int i = 0;i<n+5;i++){
int temp = (1+i)*i/2;
if(temp>=n&&(temp-n)%2==0){ //temp>=n且减数为偶数
pos = i;
break;
}
}
cout<<pos<<endl;
}
system("pause");
return 0;
}
3题
比较版本号大小
判断两个版本号大小
AC
思路:将版本号补齐,直接比较字符串的大小
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b;
while(cin>>a>>b){
if(a.size()==1)
a+=".0.0.0";
else if(a.size()==3)
a+=".0.0";
else if(a.size()==5)
a+=".0";
if(b.size()==1)
b+=".0.0.0";
else if(b.size()==3)
b+=".0.0";
else if(b.size()==5)
b+=".0";
bool flg = a>b;
if(flg)
cout<<1<<endl;
else if(a==b)
cout<<0<<endl;
else
cout<<-1<<endl;
}
system("pause");
return 0;
}
#搜狐#