LeetCode日常刷题1、657、717、67

1. 两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1] 

解答
class Solution {
    public int[] twoSum(int[] a, int target) {
        int[] res = new int[2];
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < a.length; i++) {
            if(map.containsKey(a[i])){
                res[0] = map.get(a[i]);
                res[1] = i;
            }
            map.put(target - a[i], i);
        }
        return res;
    }
}

657. 判断路线成圈

初始位置 (0, 0) 处有一个机器人。给出它的一系列动作,判断这个机器人的移动路线是否形成一个圆圈,换言之就是判断它是否会移回到原来的位置

移动顺序由一个字符串表示。每一个动作都是由一个字符来表示的。机器人有效的动作有 R(右),L(左),U(上)和 D(下)。输出应为 true 或 false,表示机器人移动路线是否成圈。

示例 1:

输入: "UD"
输出: true

示例 2:

输入: "LL"
输出: false

public class Solution {
    public boolean judgeCircle(String moves) {

        // x轴坐标
        int x = 0;
        // y轴坐标
        int y = 0;
        for (int j = 0, length = moves.length(); j < length; j++) {
            if (moves.charAt(j) == 'R') {
                 x++;
            }
            if (moves.charAt(j) == 'L') {
                 x--;
            }
            if (moves.charAt(j) == 'U') {
                 y++;
            }
            if (moves.charAt(j) == 'D') {
                 y--;
            }
        }
        return (x==0&&y==0);
    }
}
charAt(int index)方法是一个能够用来检索特定索引下的字符的String实例的方法.charAt()方法返回指定索引位置的char值。索引范围为0~length()-1.如: str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符.

717. 1比特与2比特字符

有两种特殊字符。第一种字符可以用一比特0来表示。第二种字符可以用两比特(10 或 11)来表示。

现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。

示例 1:

输入: 
bits = [1, 0, 0]
输出: True
解释: 
唯一的编码方式是一个两比特字符和一个一比特字符。所以最后一个字符是一比特字符。

示例 2:

输入: 
bits = [1, 1, 1, 0]
输出: False
解释: 
唯一的编码方式是两比特字符和两比特字符。所以最后一个字符不是一比特字符。

注意:

  • 1 <= len(bits) <= 1000.
  • bits[i] 总是0 或 1.
class Solution {
    public boolean isOneBitCharacter(int[] bits) {
        final int kl = bits.length-1;
        int i = 0;
        while(i<kl){
            i+=bits[i]+1;
        }
        return (i==kl)&&(bits[i]==0);
    }
}

这个题有点像脑筋急转弯,我们可以多写几个数组,例如bits=[1,1,0,1,0] 或者bits=[1,1,0,0,0,0],(规定了,最后一个数是0,那么只能是10,或者0)。前一个数组长度为5,后一个长度为6,而且,只有当长度为奇数的时候,才会有最后一个字符必定为一个一比特字符。

67. 二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0

示例 1:

输入: a = "11", b = "1"
输出: "100"

示例 2:

输入: a = "1010", b = "1011"
输出: "10101"
class Solution {
    public String addBinary(String a, String b) {
        int i = a.length()-1,j = b.length()-1;
        int max = Math.max(i,j);
        char[] res = new char[max+2];
        int len = max + 1;
        char[] aa = a.toCharArray();
        char[] bb = b.toCharArray();
        int carry = 0;
        while(i>=0&&j>=0){
            if(aa[i] == '1' && bb[j] == '1'){
                res[len--] = carry==0?'0':'1';
                carry = 1;
            }else if(aa[i] == '0' && bb[j] == '0'){
                res[len--] = carry==0?'0':'1';
                carry = 0;
            }else{
                if(carry == 1){
                    res[len--] = '0';
                    carry = 1;
                }else{
                    res[len--] = '1';
                    carry = 0;
                }
            }
            i--;
            j--;
        }
        while(i >= 0){
            if(carry == 0){
                res[len--] = aa[i];
            }else{
                if(aa[i] == '1'){
                    res[len--] = '0';
                    carry = 1;
                }else{
                    res[len--] = '1';
                    carry = 0;
                }
            }
            i--;
        }
        while(j >= 0){
            if(carry == 0){
                res[len--] = bb[j];
            }else{
                if(bb[j] == '1'){
                    res[len--] = '0';
                    carry = 1;
                }else{
                    res[len--] = '1';
                    carry = 0;
                }
            }
            j--;
        }
        if(carry == 1){
            res[len--] = '1';
        }else{
            res[len--] = ' ';
        }
        return new String(res).trim();
    }
}

class Solution {
  public String addBinary(String a, String b) {
        StringBuilder result = new StringBuilder();
        int pointerA = a.length()-1;
        int pointerB = b.length()-1;
        int carry = 0;
        while(pointerA>=0 || pointerB>=0){
            int sum = carry;
            if(pointerA>=0){
                sum += (a.charAt(pointerA)-'0');
                pointerA--;
            }
            if(pointerB>=0){
                sum += (b.charAt(pointerB)-'0');
                pointerB--;
            }
            result.append(sum%2);
            carry = sum/2;
        }
        if(carry!=0){
            result.append('1');
        }
        return result.reverse().toString();
    }
}
第一种方法速度快,第二种方法简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值