# 阿里春招实习3.15号编程题
## 第一题:我没在规定时间做出来。不知道下面的是不是对的
package Alibaba;
/**
* 给定三个数字(a, b, c)
* 每次取反 a或者b中一个的 某一个二进制位
* 使的 a|b = c
* 问最少几次
案例给的是:
(2,6,5) 反转3
(1,2,3) 反转0
*/
public class Demo1 {
public static void main(String[] args) {
int num = getNum(1,2,3);
System.out.println(num);
}
public static int getNum(int a, int b, int c) {
int count = 0;
int[] arr = getindex(a | b, c);
// 根据二进制位的不同进行操作
// 如果是 a.b 的两个二进制位 都是1 或操作也是 1 但是与 c的哪一位(0)相反就必须 两个都改变
// 其他情况只需要改变一个
for (int i : arr) {
if(i != -1){
// 表示已经不需要反转的位置
int temp = (a >> i) & 1;
int temp2 = (b >> i) & 1;
// 因为做的是或运算
if(temp == 1 && temp2 == 1){
count += 2;
}
else {
count += 1;
}
}
}
return count;
}
/**
* // 获取是那些 二进制位是不同的
* 从右到左获取2进制中与是1的值的索引位置。但是是反的。是从最右边开始的
* @param a
* @param b
* @return */
public static int[] getindex(int a, int b){
int c = a ^ b;
int[] arr = new int[32];
int k = 0;
for (int i = 0; i < 32; i++) {
k = c & 1;
if(k == 1){
arr[i] = i;
c >>= 1;
}else {
arr[i] = -1;
}
}
return arr;
}
}
对啦。就是说的是输入输出,我也没看明白意思。而且说的是double保留四位小数。
可能我的double都是以为小数吧。
但是我记忆中的保留四位小数,不都是emmmmm格式化输出的时候吗?
请各位大佬指正
package Alibaba;
/**
* 燃烧速度是1min/m
* 1根n米的蜡烛分成两段
* 分辨点燃, 一段烧完之后,另一段还剩余的 长度 >= 2 则继续拆分。直到烧完
* 问燃烧时间的期望
案例给的是:
n = 4的时候 燃烧时间期望是2min
*/
public class Demo2 {
public static void main(String[] args) {
double x = average(5);
System.out.println(x);
}
// 我的思路就行进行拆分
// 比如5m的蜡烛
// 拆分为(1,4),(2,3),(3,2),(4,1)分别进行燃烧
// 他们的燃烧时间就是 min(1,4) + average(abs(i - (n - i)))
public static double average(int n){
if(n <= 0){
return 0;
}
if(n == 1){
return 1d;
}
if(n == 2){
return 1d;
}
double avage = 0d;
int a = 10;
int deta = 0;
for(int i = 1; i < n; i++){
deta = Math.abs(i - (n - i));
avage = avage + Math.min(i, n - i) + average(deta);
}
return avage / (n - 1);
}
}

查看11道真题和解析