牛客编程巅峰赛S1第6场-整理
程序员文章站
2022-06-15 19:35:55
...
前言:7月份开始参加牛客编程赛,难度适中,希望每次可以好好对待并整理下来,做到每次完成及时整理。小菜鸟不对的地方还请大家指正
- 循环右移
import java.util.*;
public class Solution {
/**
* 位移后二进制串的十进制值
* @param str string字符串 二进制字符串
* @param k int整型 循环位移次数
* @return long长整型
*/
//思路:该循环右移,即将前面的k个字符放到后面拼接,注意点即k的大小
public long rotateRight (String str, int k) {
// write code here
long res = 0;
int len = str.length();
k = k%len;
String pre = str.substring(0,len-k);
String next = str.substring(len-k,len);
StringBuilder sb = new StringBuilder();
sb.append(next);
sb.append(pre);
//计算值
int digit = 0;//次方
for(int i=len-1;i>=0;i--){
if(sb.charAt(i)=='1'){
res+=(long)(Math.pow(2,digit));
}
digit++;
}
return res;
}
}
- 牛牛爱奇数
import java.util.*;
public class Solution {
/**
* 返回一个数,代表让这些数都变成奇数的最少的操作次数
* @param n int整型 代表一共有多少数
* @param a int整型一维数组 代表n个数字的值
* @return int整型
*/
//思路:无需要考虑相同的数字个数,其实整个考虑的是当前有多少个偶数类别,将他们转换的次数叠加,但是在整个过程中会出现重复,比如16,32,先操作32会产生16,则从大数开始考虑==>这里可以使用TreeSet
public int solve (int n, int[] a) {
// write code here
TreeSet<Integer> set = new TreeSet<Integer>();
for(int i=0;i<n;i++){
if(a[i]%2==0){
set.add(a[i]);
}
}
//此时Set
int res = 0;
while(!set.isEmpty()){
//取出最大的数字;
int tmp = set.last();//目前最大的元素
set.remove(tmp);//删除该元素
tmp = tmp/2;
res++;
//再将其添加上,如果存在会覆盖
if(tmp%2==0){
set.add(tmp);
}
}
return res;
}
}
- 牛牛摆放花
import java.util.*;
public class Solution {
/**
* 返回按照这些花排成一个圆的序列中最小的“丑陋度”
* @param n int整型 花的数量
* @param array int整型一维数组 花的高度数组
* @return int整型
*/
//思路:贪心做法,要想最终的最大差距最小,对于每一盆花来说,可以选取高度最近的花作为摆放后的邻居,则最后可以使得最终的的结果最小
public int solve (int n, int[] array) {
Arrays.sort(array);
int res = -1;
for(int i=0;i<n-2;i++){
res = Math.max(res,array[i+2]-array[i]);
}
res = Math.max(res,array[n-1]-array[n-2]);
res = Math.max(res,array[1]-array[0]);
return res;
}
}
推荐阅读