少年游

欲买桂花同载酒,终不似,少年游。

0%

2017网易校招笔试编程整理

数位和最小

一个数字的数位和定义为这个数字所有位置的数值的总和,例如:
1234的数位和为:1 + 2 + 3 + 4 = 10
5463的数位和为:5 + 4 + 6 + 3 = 18
现在有三个数A、B、C,需要你求出在A、B范围内(包括A,B)的一个数X,让X的数位和与C的数位和差值最小。

输入:为一行,一行有三个数A,B,C,使用空额隔开。
(1<=A,B,C<=1,000,000,000)
(0 <= B-A <=100,000)
输出:输出一个数X,如果多个解输出最小的那个解。

1
<!-- more --> 

二进制权重相同的数字

给定一个数字N,求与数字N相同权重的数字X。
要求:数字X = min(D), D > N
权重:数字N的二进制位上’1’的个数。

N = 5 二进制是101 权重是2 输出X = 6
N = 97 二进制是110001 权重是3 输出X= 98

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.leetcode;


import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N;
N = sc.nextInt();
System.out.println(fun(N));
}
public static int fun(int num){
String str = Integer.toBinaryString(num);
str = flip(str);
return Integer.parseInt(str, 2);
}

public static String flip(String str){
StringBuilder sb = new StringBuilder();
int strLen = str.length();
int flag = 0;
for(int i = 0 ;i < strLen;i ++){
char c = str.charAt(strLen - i - 1);
//第一个为'1'的位置
if(flag == 0 && c == '1'){
sb.append('0');
flag = 1;
}
//第一个为'0'的位置
else if(flag == 1 && c == '0'){
sb.append('1');
flag = 2;
}
else{
sb.append(c);
}
}
//若是字符串中没有'0',左移 << 1
if(flag != 2)return str + "0";
else return sb.reverse().toString();
}

}

#