牛牛算数
题目描述
给你一个含有n个元素的数组arr[i],请你告诉牛牛这个数组的中位数大还是平均数大,如果中位数更大输出1,如果平均数更大输出-1,如果中位数和平均数相等输出0
示例1
输入
[1,3,4]
输出
1
说明
中位数3,平均数约等于2.67,所以输出1
示例2
输入
[7,4,8,11]
输出
0
说明
中位数7.5,平均数7.5,所以输出0
示例3
输入
[6,6,6,6,5,8]
输出
-1
说明
中位数6,平均数约等于6.17,所以输出-1
备注
对于30%的数据: 1 ≤ n ≤ 1 e 3 , 1 ≤ a r r [ i ] ≤ 1 e 9 1\leq n\leq 1e3,1\leq arr[i]\leq 1e9 1≤n≤1e3,1≤arr[i]≤1e9
对于100%的数据: 1 ≤ n ≤ 1 e 6 , 1 ≤ a r r [ i ] ≤ 1 e 9 1\leq n\leq 1e6,1\leq arr[i]\leq 1e9 1≤n≤1e6,1≤arr[i]≤1e9
思路1:直接计算(注意奇偶的判别) |
class Solution {
public:
/**
*
* @param arr int整型vector
* @return int整型
*/
int Answerofjudge(vector<int>& arr) {
// write code here
sort(arr.begin(),arr.end());
int n = arr.size();
double mid = 0.0;
if(n&0x1) {
mid = arr[n>>1];
}else{
mid = (arr[n>>1] + arr[(n-1)>>1]) * 1.0 / 2;
}
double avg = accumulate(arr.begin(),arr.end(),0.0) * 1.0 / n;
if(mid == avg) return 0;
else if(mid > avg) return 1;
else return -1;
}
};
思路2:避开浮点数的计算 |
class Solution {
public:
/**
*
* @param arr int整型vector
* @return int整型
*/
using LL = long long;
int Answerofjudge(vector<int>& arr) {
// write code here
sort(arr.begin(),arr.end());
LL sum = 0; int n = arr.size();
for(auto a : arr) sum += a;
LL mid = 0;
if(n&0x1) mid = 1LL * arr[n >> 1] * n;
else mid = 1LL * (arr[(n >> 1) - 1] + arr[n >> 1]) * (n >> 1);
if(sum == mid) return 0;
if(mid > sum) return 1;
else return -1;
}
};
怕npy的牛牛
题目描述
牛牛非常怕他的女朋友,怕到了走火入魔的程度,以至于每当他看到一个字符串同时含有n,p,y三个字母他都害怕的不行。现在有一个长度为m的只包含小写字母‘a’-‘z’的字符串x,牛牛想知道能令他不害怕的最长子串的长度是多少。(对于字符串”abc”来说,”c”,”ab”都是原串的子串,但”ac”不是原串子串)
示例1
输入
“abcdefghijklmn”
输出
14
说明
因为所有子串都不同时含有n,p,y,所以最长子串的长度即为字符串x的长度14。
示例2
输入
“ynp”
输出
2
说明
长度为2的字串”yn”,”np”都符合题意,不存在长度>=3的符合条件的子串。
示例3
输入
“ypknnbpiyc”
输出
7
说明
“pknnbpi”为其符合条件的最长子串,长度为7。
备注
对于40%的数据: 1 ≤ m ≤ 100 1\leq m\leq 100 1≤m≤100
对于100%的数据: 1 ≤ m ≤ 1000000 1\leq m\leq 1 000 000 1≤m≤1000000
函数共有一个参数,即题目描述中的字符串x,保证字符串中字母均为小写字母
注意,所给字符串不含引号
思路:双指针 |
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回符合题意的最长的子串长度
* @param x string字符串
* @return int整型
*/
int Maximumlength(string x) {
// write code here
int cnt[130] = {0};
int l = 0 , r = 0, ans = 0,n = x.size();
while(r < n){
cnt[x[r]]++;
while(cnt['n'] * cnt['p'] * cnt['y']){
cnt[x[l++]]--;
}
ans = max(ans, r - l + 1);
r++;
}
return ans;
}
};
牛牛与后缀表达式
题目描述
给定牛牛一个后缀表达式s,计算它的结果,例如,1+1对应的后缀表达式为1#1#+,‘#’作为操作数的结束符号。
其中,表达式中只含有‘+’、’-‘、’*‘三种运算,不包含除法。
本题保证表达式一定合法,且计算过程和计算结果的绝对值一定不会超过 1 0 18 10^{18} 1018
示例1
输入
“1#1#+”
输出
2
说明
1#1#+这个后缀表达式表示的式子是1+1,结果为2
示例2
输入
“12#3#+15#*”
输出
225
说明
12#3#+15#*这个后缀表达式表示的式子是(12+3)*15,结果为225
备注
1 ≤ 表 达 式 中 操 作 数 ≤ 1 0 9 1\leq 表达式中操作数\leq 10^9 1≤表达式中操作数≤109
1 ≤ 表 达 式 长 度 ≤ 1 0 6 1\leq 表达式长度\leq 10^6 1≤表达式长度≤106
思路:栈的应用(后缀表达式的计算) |
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 给定一个后缀表达式,返回它的结果
* @param str string字符串
* @return long长整型
*/
long long solve(string str) {
// write code here
int n = str.size(); stack<long long> st;
int i = 0;
while(i < n){
if(isdigit(str[i])){
long long cur = 0;
while(i < n && str[i] != '#'){
cur = cur * 10 + (str[i++] - '0');
}
st.push(cur);
}
else{
auto a = st.top(); st.pop();
auto b = st.top(); st.pop();
if(str[i] == '+') st.push(a + b);
else if(str[i] == '-') st.push(b - a);
else st.push(a * b);
}
i++;
}
return st.top();
}
};