您的位置:首页 > 编程语言 > Java开发

LintCode Introduce Java & Coding Interview

2018-02-08 02:06 357 查看

LintCode Introduce Java 必做部分

9.4号美国劳动节放假一天,换个平台刷点算法题,先从基础的开始,由于这部分题目比较简单,我准备一个单元分两次写博客,一次必做题部分,一次选做题部分。今天带来的是第一单元必做题部分:

第一题

反转一个只有3位数的整数。

注意事项

你可以假设输入一定是一个只有三位数的整数,这个整数大于等于100,小于1000。

样例

123 反转之后是 321。

900 反转之后是 9。

这道题和之前LeetCode的一到反转题很像,但是难度要第一点,因为规定了是三位数,也就不存在反转后溢出的问题;核心思路就是要把输入的三位数一位一位分离出来,然后乘以相应的位数。代码如下:

public int reverseInteger(int number) {
// write your code here
int sum = 0;
for (int i = 0; i < 3; i++){
int n = number % 10;
sum = sum * 10 + n;
number = number / 10;
}
return sum;
}


第二题 Fizz Buzz 问题

给你一个整数n. 从 1 到 n 按照下面的规则打印每个数:

如果这个数被3整除,打印fizz.

如果这个数被5整除,打印buzz.

如果这个数能同时被3和5整除,打印fizz buzz.

这道题就是根据不同的条件输出不同的字符串,要注意的一点是我们需要先判断条件3,因为有的数字同时是3和5的倍数,如果此时先判断了条件1或者条件2,那么输出就不是fizz buzz了。代码如下:

public List<String> fizzBuzz(int n) {
ArrayList<String> arr = new ArrayList<String>();
for (int i = 1; i <= n; i++){
if (i % 3 == 0 && i % 5 ==0){
arr.add("fizz buzz");
}else if (i % 5 == 0){
arr.add("buzz");
}else if (i % 3 == 0){
arr.add("fizz");
}else{
arr.add(String.valueOf(i));
}
}
return arr;
}


第三题

给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。

这道题题目意思很明确,将a+b的和返回即可,但是程序中不能使用+号。很直接想到是利用位运算符,在二进制中操作数字。其实不同的进制都包含进位,只不过二进制是逢二进一。当然在这之前我们需要把不进位的各个位相加。在这以2+3为例进行说明。

2在二进制中为00000010

3在二进制中为00000011

第一步不进位的各个位相加,也就是00000010+00000011,这个+号在这里要用异或,异或运算符就是相同为0,不同为1,而二进制中每个位只有0和1,如果都为1,和为0的情况说明进位了。那么这样操作后结果为:00000001

第二步我们要计算进位运算,这时候应该用&运算符,相同为1,不同为0。00000010 & 00000011 = 00000010,要注意的是&运算完之后需要左移以为,使用<<,不然没有进位。左移后为00000100。

第三部如果满足第二步进位的值为0,则返回第一步的值,就是两数之和了。若果第二步进位的值不为0,例如本例中,00000100是十进制的4,不为0。所以需要重复第一步和第二步,即00000001 ^ 00000100 = 00000101,然后00000001 & 00000100 = 00000000。此时00000000等于十进制的0,返回00000101,即
4000
为十进制的5。

分析完毕,代码如下:

public int aplusb(int a, int b) {
// write your code here
int sum = 0;
int jinwei = 0;
do{
sum = a^b;
jinwei = (a&b) << 1;
a = sum;
b = jinwei;
}while(jinwei != 0);

return sum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: