1、循环数比较
题目描述
对于任意两个正整数x和k,我们定义repeat(x, k)为将x重复写k次形成的数,例如repeat(1234, 3) = 123412341234,repeat(20,2) = 2020.
牛牛现在给出4个整数x1, k1, x2, k2, 其中v1 = (x1, k1), v2 = (x2, k2),请你来比较v1和v2的大小。
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int x1=scanner.nextInt();
int k1=scanner.nextInt();
int x2=scanner.nextInt();
int k2=scanner.nextInt();
String str1 = "",str2 = "";
for(int i=0;i<k1;i++){
str1+=x1;
}
for(int i=0;i<k2;i++){
str2+=x2;
}
if(str1.length()<str2.length()){
System.out.println("Less");
}else if(str1.length()>str2.length()){
System.out.println("Greater");
}else{
for(int i=0;i<str1.length();i++){
if(str1.charAt(i)==str2.charAt(i)){
continue;
}else if(str1.charAt(i)<str2.charAt(i)){
System.out.println("Less");
return;
}else{
System.out.println("Greater");
return;
}
}
System.out.println("Equal");
}
}
}
2、青草游戏
题目描述:
牛牛和羊羊都很喜欢青草。今天他们决定玩青草游戏。
最初有一个装有n份青草的箱子,牛牛和羊羊依次进行,牛牛先开始。在每个回合中,每个玩家必须吃一些箱子中的青草,所吃的青草份数必须是4的x次幂,比如1,4,16,64等等。不能在箱子中吃到有效份数青草的玩家落败。假定牛牛和羊羊都是按照最佳方法进行游戏,请输出胜利者的名字。
思路:
规律0,1,2,3,4,羊牛羊牛牛。
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
for(int i=0;i<t;i++){
int grass = scanner.nextInt();
if(grass%5==0||grass%5==2){
System.out.println("yang");
}else{
System.out.println("niu");
}
}
scanner.close();
}
}
3、无聊的牛牛和羊羊
题目描述:
牛牛和羊羊非常无聊.他们有n + m个共同朋友,他们中有n个是无聊的,m个是不无聊的。每个小时牛牛和羊羊随机选择两个不同的朋友A和B.(如果存在多种可能的pair(A, B),任意一个被选到的概率相同。),然后牛牛会和朋友A进行交谈,羊羊会和朋友B进行交谈。在交谈之后,如果被选择的朋友之前不是无聊会变得无聊。现在你需要计算让所有朋友变得无聊所需要的时间的期望值。
思路:(借鉴讨论)
链接:https://www.nowcoder.com/questionTerminal/327ff11066b640b6957883e1ba5ec40c
本题考察递推公式,设总共有s个0,1(s >= 2),每次从其中随机选出2个,将这两个数中的1变成0,试求平均多少次操作后,s个数全部变成0.
当s个数中有k个1时,设平均需要f(k)次操作使得s个数全部变成0.一次操作后有3种可能性,即k --> k, k --> k - 1, k --> k - 2.分别表示取出了00, 01或10,11.这三种情况的概率分别为C(s - k, 2)/C(s, 2), (s - k) * k / C(s, 2), C(k, 2)/C(s, 2). 由此可以得到f(k)的递推公式.
f(k) = 1 + C(s - k, 2) / C(s, 2) f(k) + (s - k) k / C(s, 2) f(k - 1) + C(k, 2) / C(s, 2) f(k - 2)
化简此递推公式,即得到k到k-1,k-2的递推公式。当k=1时,是特殊情况,由分析可以得到f(1) = f(0) + s / 2, f(0) = 0.综上得解.
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();// bored
int m = scanner.nextInt();//
if(m==0){
System.out.println(0);
return;
}
int s = n + m;
double f0 = 0;
double f1 = (n + m)/2.0;
for(int k=2;k<=m;k++){
double temp = (s*(s-1)+2*k*(s-k)*f1+k*(k-1)*f0)/(s*(s-1)-(s-k)*(s-k-1));
f0 = f1;
f1 = temp;
}
System.out.println(Math.round(f1*10)/10.0);
}
}
4、幸运子序列
题目描述:
牛牛得到一个长度为n的整数序列V,牛牛定义一段连续子序列的幸运值为这段子序列中最大值和次大值的异或值(次大值是严格的次大)。牛牛现在需要求出序列V的所有连续子序列中幸运值最大是多少。请你帮帮牛牛吧。
思路:
对于每一个数字,先前找到第一个比这个大的就输出,如果没有,找到先前最大的。
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int nums[] = new int[n];
for(int i=0;i<n;i++){
nums[i] = scanner.nextInt();
}
int lucky = Integer.MIN_VALUE;
for(int i=1;i<n;i++){
if(nums[i]>nums[0]){
lucky = nums[0]^nums[i];
break;
}
}
for(int i=1;i<n;i++){
int maxValue = -1;
for(int j=i-1;j>=0;j--){
if(nums[j]>nums[i]){
lucky = Math.max(lucky,nums[j]^nums[i]);
break;
}else if(nums[j]>maxValue){//e.g. 1 2 3 4
lucky = Math.max(lucky,nums[j]^nums[i]);
maxValue = nums[j];
}
}
}
System.out.println(lucky);
}
}
5、缺失的括号
题目描述:
一个完整的括号字符串定义规则如下:
1、空字符串是完整的。
2、如果s是完整的字符串,那么(s)也是完整的。
3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。
例如,"(()())", ““和”(())()“是完整的括号字符串,”())(”, “()(” 和 ")"是不完整的括号字符串。
牛牛有一个括号字符串s,现在需要在其中任意位置尽量少地添加括号,将其转化为一个完整的括号字符串。请问牛牛至少需要添加多少个括号。
思路:
利用栈匹配()。
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
char[] str = scanner.nextLine().toCharArray();
scanner.close();
Stack<Character> stack = new Stack<>();
int count = 0;
for(int i=0;i<str.length;i++){
if(str[i]=='('){
//System.out.print("push"+" ");
stack.push(str[i]);
}else{
if(stack.isEmpty()){
count++;
}else{
//System.out.print("pop"+" ");
stack.pop();
}
}
}
count+=stack.size();
System.out.println(count);
}
}