LintCode Introduce Java & Coding Interview

来源:互联网 发布:网络炒作事件 编辑:程序博客网 时间:2024/06/06 02:35

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,即为十进制的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;}