小中大
问题
输入一组有序整数,输出最大值,中位数,最小值。如果有小数的话,四舍五入保留一位小数。
思路
数组有序,最值就在两头,比较头尾即可输出最大最小值。
中位数,需要判断数列奇偶情况,奇数直接输出num[n/2],偶数的话,输出,(num[ n / 2 ] + num[ n / 2 - 1 ]) / 2.0
int / .0 的话,结果的精度应该是和.0对其的,而且,因为是两个整数平均数,所以如果有小数的话,也只有.5的情况,所以我觉得自己这样处理是完全可以的,但是,事实不是,运行只有90分。还是在我又完善处理了,n=1的情况。也有看其他博主的方法,但我不认同,我觉得我就是对的,这个题也消耗我太多耐心,暂时先不管了。
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> num(n);
double median;
int max, min;
if( n == 1 ) {
cin >> num[0];
cout << num[0] << " " << num[0] << " " << num[0] << endl;
}
if( n > 1 ) {
for(int i = 0; i < n; i++)
cin >> num[i];
if( num[0] >= num[n - 1] ) {
max = num[0];
min = num[n-1];
} else {
max = num[n-1];
min = num[0];
}
cout << max << " ";
if( n % 2 == 0 ) {
cout << (num[ n / 2 ] + num[ n / 2 - 1 ]) / 2.0 << " ";
} else
cout << num[ n / 2 ] << " ";
cout << min << endl;
}
return 0;
}
get
没有get,get到了伤心
二十四点
问题
输入n个表达式,求运算结果是不是24。
我的思路
用栈来做,扫描表达式,一个数字栈一个运算符栈,数字直接入栈,运算符判断后操作。
运算符优先级<= 栈顶,往前计算,弹出数字栈中的两个数字,弹出栈顶运算符,计算后结果入栈。
运算符优先级>栈顶,往后计算,再压入一个数字之后,弹出数字栈中的两个数字,弹出栈顶运算符,计算后结果入栈。
以上的太复杂了,如果没有括号,好像也不用比较优先级啥的,直接扫描,遇到数字入栈,遇到乘除就运算,遇到加减入栈,扫描完了之后,依次出栈运算。
优秀的思路
CCF试题 201903-2 二十四点
照自己以上的思路,运行样例结果是正确的,但是提交后只有30分,输出运算结果后,发现一个纯加减法的运算结果是错误,调试后发现是因为加减法在运算的时候,运算符号是右结合的,但如果采用栈的话,如果是7-9+8,运算的话,就是,8+9-7,运算符会往左结合,所以入栈的时候讲减号直接和数字结合入栈,也就是博主所说的,减法改造成加法。
以下代码基本和博主的一样,感谢博主优秀的代码,抱拳.gif
10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5
#include <iostream>
#include <stack>
#include <vector>
#include <string>
using namespace std;
int main() {
stack<int> nums;
stack<char> opts;
int n;
cin >> n;
vector<int> ans(n);//保存结果,0 no,1 yes
char opt;
string str;
for(int j = 0; j < n; j++) {
cin >> str;
for(int i = 0; i < 7; i++) {
if (isdigit(str[i])) {
nums.push(str[i] - '0');
} else if (str[i] == '+') {
opts.push(str[i]);
} else if (str[i] == '-'){
opts.push('+');
nums.push(-(str[i+1]-'0'));
i++;
}
else if(str[i] == 'x') { //计算乘法
int num1 = nums.top();
nums.pop();
nums.push(num1 * (str[i + 1] - '0'));
i++;
} else if(str[i] == '/') { //计算除法
int num1 = nums.top();
nums.pop();
nums.push(num1 / (str[i + 1] - '0'));
i++;
}
}
while(!opts.empty()) {
int num1 = nums.top();
nums.pop();
int num2 = nums.top();
nums.pop();
opt = opts.top();
if(opt == '+')
nums.push(num1 + num2);
else nums.push(num2 - num1);
opts.pop();
}
if(nums.top() == 24) {
ans[j] = 1;
} else ans[j] = 0;
nums.pop();
}
for (int i = 0; i < n; i++) {
if(ans[i] == 0) {
cout << "No" << endl;
} else cout << "Yes" << endl;
}
return 0;
}
get
表达式运算,用栈,应该是优先级高的先算,还有就是运算符号都是右结合的,不过这里因为乘除直接运算了,没有啥问题。全都入栈之后在运算的话,就要考虑运算符结合的问题了。