LintCode Introduce Java & Coding Interview

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值