461. Hamming Distance
- 题意:两个数字的二进制有多少位不同
- 思路:判断x^y的二进制结果有多少个1
1 2 3 4 5 6 7
| public int hammingDistance(int x, int y) { int xor = x ^ y; int sum = 0; for(int i = 0;i<=31;i++) sum +=(xor >> i) & 1; return sum; }
|
412. Fizz Buzz
- 题意:3的倍数输出Fizz,5的倍数输出Buzz,既是3的倍数也是5的倍数输出FizzBuzz
- 思路:先判断既是3和5的倍数的情况
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public List<String> fizzBuzz(int n) { List<String> ans = new ArrayList<String>(); for(Integer i = 1;i <= n;i++){ if(i%3==0 && i%5==0) ans.add("FizzBuzz"); else if(i%3==0) ans.add("Fizz"); else if(i%5==0) ans.add("Buzz"); else ans.add(i.toString()); } return ans; }
|
344. Reverse String
- 题意:反转一个字符串
- 思路:递归翻转,每次将字符串分半
代码
1 2 3 4 5
| public String reverseString(String s){ if(s.length()<=1) return s; return reverseString(s.substring(s.length()/2,s.length())) + reverseString(s.substring(0,s.length()/2)); }
|
463. Island Perimeter
- 题意:给一个01矩阵,1代表陆地,0代表海,问需要多少围栏将陆地围成一块
- 思路:遍历矩阵,假设一个1需要4个围栏,判断每个1四周是否为1,为1则减去一个围栏
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class Solution { public int islandPerimeter(int[][] grid) { int ans = 0; int x; int y; int[][] dir= new int[][]{{1,0},{0,1},{-1,0},{0,-1}}; for(int i = 0;i<grid.length;i++){ for(int j =0;j<grid[0].length;j++){ if(grid[i][j]==1) { int cnt = 4; for (int k = 0; k < 4; k++) { x = i + dir[k][0]; y = j + dir[k][1]; if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length) { if (grid[x][y] == 1) cnt--; } } ans+=cnt; } } } return ans; } }
|
448. Find All Numbers Disappeared in an Array
- 题意:找出数组(1≤a[i]≤n,n = size of array)中没出现的数字
- 思路:
- 开一个数组记录哪些数字出现过
- 对每个元素nums[nums[i] -1] = -nums[nums[i]-1],最后哪个位置的值大于则该下标对应的数字就是没出现过的
代码
1 2 3 4 5 6 7 8 9 10 11 12 13
| public List<Integer> findDisappearedNumbers(int[] nums) { List<Integer> ret = new ArrayList<Integer>(); for(int i = 0; i < nums.length; i++) { int val = Math.abs(nums[i]) - 1; if(nums[val] > 0) nums[val] = -nums[val]; } for(int i = 0; i < nums.length; i++) { if(nums[i] > 0) ret.add(i+1); } return ret; }
|
136. Single Number
- 题意:给定一个整数数组,每个数字都出现两次但有个数字只出现一次,找出这个数字
- 思路:将数组所有的元素异或一遍,因为两个相同的数字异或的结果为0,0与一个数字异或结果不变
代码
1 2 3 4 5 6
| public int singleNumber(int[] nums) { int ans = nums[0]; for(int i = 1;i < nums.length;i++) ans^=nums[i]; return ans; }
|
371. Sum of Two Integers
- 题意:不使用四则运算符实现两个数相加
- 思路:相同位相加时会进位
- 例子:7+2
=0111+0010
=0101+0100
=1000+0001
=1001(9)
代码
1 2 3 4 5 6 7 8 9 10
| public int getSum(int a, int b) { if(a==0)return b; if(b==0)return a; while(b!=0){ int carry = a & b; a = a ^ b; b = carry<<1; } return a; }
|
104. Maximum Depth of Binary Tree
- 题意:求一棵二叉树的最大深度
- 思路:递归左右子树的深度,返回最大值
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public int maxDepth(TreeNode root) { if(root == null) return 0; int depthLeft = maxDepth(root.left); int depthRight = maxDepth(root.right); return 1+(depthLeft > depthRight ? depthLeft : depthRight); } }
|
389. Find the Difference
- 题意:给两个只包含小写的字符串,第二个字符串是在第一字符串随机洗乱后再随机插入一个字符,找出这个字符
- 思路:
- 两个数组记录每个字符串中小写字母出现的次数
- 通过异或运算
代码
1 2 3 4 5 6 7 8 9
| public char findTheDifference(String s, String t) { int n = t.length(); char c = t.charAt(n - 1); for (int i = 0; i < n - 1; ++i) { c ^= s.charAt(i); c ^= t.charAt(i); } return c; }
|
258. Add Digits
- 题意:给一个数反复的将每位数相加,直到结果为一位数(38->3+8=11->1+1=2)
- 思路:
- 递归求解
- (100a+10b+c)%9 = (a+99a+b+9b+c)%9=(a+b+c)%9
代码
1 2 3
| public int addDigits(int num) { return num==0?0:(num%9==0?9:(num%9)); }
|