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();
}
}
第一种方法速度快,第二种方法简洁。