链接:https://ac.nowcoder.com/acm/contest/6490/A
来源:牛客网
题目描述
牛牛有一个二进制数的字符串,他想把字符串循环右移k位,然后得到一个新的二进制数,你能告诉牛牛这个数的十进制值是多少吗。给定一个二进制字符串str和循环位移位数k,返回循环后的二进制数的十进制值。
示例1
输入
复制
“10110”,2
输出
复制
21
说明
新二进制串为“10101”,十进制值为21
备注:
1\leq|str|\leq 63,1\leq k\leq|str|1≤∣str∣≤63,1≤k≤∣str∣
class Solution {
public:
/**
* 位移后二进制串的十进制值
* @param str string字符串 二进制字符串
* @param k int整型 循环位移次数
* @return long长整型
*/
long long rotateRight(string str, int k) {
// write code here
long long n=str.size();
long long ans=0;
for(int i=n-k;i<n;i++){
ans=ans*2+(str[i]-'0');
}
for(int i=0;i<n-k;i++){
ans=ans*2+(str[i]-'0');
}
return ans;
}
};
链接:https://ac.nowcoder.com/acm/contest/6490/B
来源:牛客网
题目描述
在牛牛面前放着nn个数,这些数字既有奇数也有偶数,只不过牛牛对奇数情有独钟,他特别想让这些数都变成奇数。
现在牛牛获得了一种能力,他可以执行一种操作:每次选中一个偶数,然后把这些数中与该数相等的数都除以2,例如现在有一个数组为[2,2,3][2,2,3],那么牛牛可以执行一次操作,使得这个数组变为[1,1,3][1,1,3]。
牛牛现在想知道,对于任意的nn个数,他最少需要操作多少次,使得这些数都变成奇数?
示例1
输入
复制
3,[2,2,3]
输出
复制
1
说明
只需做一次操作,会将其中的偶数2都变成1,满足了所有的数都是奇数的要求。
示例2
输入
复制
3,[1,3,7]
输出
复制
0
说明
不需要做任何操作,因为所有的数原本就是奇数。
备注:
1 \leq n \leq 10^{6},代表一个有多少数字1≤n≤10
6
,代表一个有多少数字
a_{1},a_{2},a_{3}…a_{n}(1 \leq a_{i} \leq 10^{9})代表数字的大小a
1
,a
2
,a
3
…a
n
(1≤a
i
≤10
9
)代表数字的大小
对于25%的数据,1 \leq n \leq 10^{2},1 \leq a_{i} \leq 10^{3}对于25%的数据,1≤n≤10
2
,1≤a
i
≤10
3
对于75%的数据,1 \leq n \leq 10^{4},1 \leq a_{i} \leq 10^{6}对于75%的数据,1≤n≤10
4
,1≤a
i
≤10
6
对于100%的数据,1 \leq n \leq 10^{6},1 \leq a_{i} \leq 10^{9}对于100%的数据,1≤n≤10
6
,1≤a
i
≤10
9
class Solution {
public:
/**
* 返回一个数,代表让这些数都变成奇数的最少的操作次数
* @param n int整型 代表一共有多少数
* @param a int整型vector 代表n个数字的值
* @return int整型
*/
set<int>s;
int solve(int n, vector<int>& a) {
// write code here
for(int i=0;i<n;i++){
if(a[i]%2==0){
s.insert(a[i]);
}
}
int ans=0;
while(s.size()){
int t=*s.rbegin();
ans++;
s.erase(s.find(t));
t>>=1;
if((t&1)==0)s.insert(t);
}
return ans;
}
};
链接:https://ac.nowcoder.com/acm/contest/6490/C
来源:牛客网
题目描述
牛牛有n朵需要摆放的花,但是每朵花呢,高度都不一样,牛牛不喜欢相邻的花高度相差太多,这样会影响美感。
所以牛牛提出了一个“丑陋度”的概念,“丑陋度”意思为在一个摆放序列中,相邻花高度差的最大值。而且牛牛是一个完美主义者,所以他希望:
1.将这些花摆成首尾相接的圆形
2.为了美观,他希望摆放的花“丑陋度”最小
程序应返回:按照这些花排成一个圆的顺序,输出在多个摆放花的序列中,最小的“丑陋度”。
示例1
输入
复制
5,[2,1,1,3,2]
输出
复制
1
说明
可以摆成 1 2 3 2 1这样的序列,最小的“丑陋度”为1
示例2
输入
复制
3,[30,10,20]
输出
复制
20
说明
可以摆成10 30 20这样的序列,最小的“丑陋度”为20
备注:
第一个参数为一个整数 n (2\leq n \leq 10^{5}),代表花的数量。第一个参数为一个整数n(2≤n≤10
5
),代表花的数量。
第二个参数为包含a_{1},a_{2},a_{3}…a_{n}(1 \leq a_{i} \leq 10^{9})的数组,代表每朵花的高度。第二个参数为包含a
1
,a
2
,a
3
…a
n
(1≤a
i
≤10
9
)的数组,代表每朵花的高度。
对于20%的数据,2\leq n \leq10, 1\leq a_{i} \leq10^{2}对于20%的数据,2≤n≤10,1≤a
i
≤10
2
对于60%的数据,2\leq n \leq10^{3}, 1\leq a_{i} \leq10^{6}对于60%的数据,2≤n≤10
3
,1≤a
i
≤10
6
对于100%的数据,2\leq n \leq10^{5}, 1\leq a_{i} \leq10^{9}对于100%的数据,2≤n≤10
5
,1≤a
i
≤10
9
class Solution {
public:
/**
* 返回按照这些花排成一个圆的序列中最小的“丑陋度”
* @param n int整型 花的数量
* @param array int整型vector 花的高度数组
* @return int整型
*/
int solve(int n, vector<int>& a) {
// write code here
sort(a.begin(),a.end());
deque<int>f;
for(int i=0;i<a.size();i++){
if(i&1){
f.push_back(a[i]);
}
else f.push_front(a[i]);
}
int ans=0;
for(int i=1;i<n;i++){
ans=max(ans,abs(f[i]-f[i-1]));
}
ans=max(ans,abs(f[0]-f[n-1]));
return ans;
}
};