这道题早晨解决时候卡死在答案只能正确百份之五十,午觉醒来举出反例,想到了还有百分之五十如何解决。
#include <cstdio>
#include <string>
#include <queue>
using namespace std;
typedef long long LL;
queue< LL >que;
const int n=10; //数字个数
void duqu();
void chuli();
void shuchu();
int main(){
duqu();
chuli();
shuchu();
return 0;
}
void duqu(){
LL a;
for(int i = 0; i < n; i++){
scanf("%ld", &a);
que.push(a);
}
}
void chuli(){
if (que.empty()==true) return;
LL max=que.front(), min=que.front(), first=que.front(), last=que.back();
LL a = 0;
for(int i = 0; i < n; i++){
a=que.front();
que.pop(); //不能用 a = que.pop(); 因为 que.pop()的返回值为空
max = a>max ? a:max;
min = a<min ? a:min;
que.push(a);
}
for(int i = 0; i < n; i++){
a=que.front();
que.pop();
if(i == 0) que.push(min);
else{
if(a == min) que.push(first);
else que.push(a);
}
} //将其中最小的数与第一个数对换
for(int i = 0; i < n; i++){
a=que.front();
que.pop();
if(i == n-1) que.push(max);
else{
if(a == max) que.push(last);
else que.push(a);
} //把最大的数与最后一个数对换
/* switch (i){
case 0: que.push(max);
break;
case (n-1): que.push(min);
break;
default: if(a == max) que.push(last);
else if(a == min) que.push(first);
else que.push(a);
}; */ //本人一开始使用的是switch,只能真确百分之五十,会导致交换的两步相互冲突,
//要保证不冲突就任意一步交换单独循环一次。注:case(n)里的n必须为常量
}
}
void shuchu(){
if (que.empty()) return;
LL a = 0;
for(int i = 0; i < n; i++){
a=que.front();
printf("%ld ",a);
que.pop();
}
}
还请大家多多指出代码冗余之处以及用queue解决的新思路。
转载请注明出处。