476. Number Complement
- 暴力将每一位为0的对应的2的乘方加起来
- ~num & ((Integer.highestOneBit(num) << 1) - 1);highestOneBit(num):获取长整数二进制最高位1的索引
代码
1 2 3
| public int findComplement(int num) { return ~num & ((Integer.highestOneBit(num) << 1) - 1); }
|
283. Move Zeroes
- 题意:在不开新数组的情况下将一个数组的0移到最后
- 思路:没什么好说的( ⊙ o ⊙ )
代码
1 2 3 4 5 6 7 8 9
| public void moveZeroes(int[] nums) { int index = 0; for(int i = 0;i<nums.length;i++){ if(nums[i] != 0) nums[index++]=nums[i]; } for(;index<nums.length;index++) nums[index] = 0; }
|
392. Is Subsequence
- 题意:判断一个字符串是不是另一个字符串的子序列
- 思路:暴力判断字符串的每个字符
代码
1 2 3 4 5 6 7 8 9 10 11
| public boolean isSubsequence(String s, String t) { int i = 0; for(int j = 0;i<s.length() && j<t.length();j++){ if(s.charAt(i)==t.charAt(j)) i++; } if(i!=s.length()) return false; else return true; }
|
383. Ransom Note
- 题意:判断一个字符串中的字符能不能构成另一个字符串的部分字符
- 思路:判断字符串出现次数
代码
1 2 3 4 5 6 7 8 9
| public boolean canConstruct(String ransomNote, String magazine) { int[] vis = new int[26]; for(int i = 0;i < magazine.length();i++) vis[magazine.charAt(i)-'a']++; for(int i = 0;i < ransomNote.length();i++) if(--vis[ransomNote.charAt(i)-'a'] < 0) return false; return true; }
|
404. Sum of Left Leaves
- 题意:求一棵二叉树的所有左叶子的和
- 思路:递归左右子树,当一个点有左节点且左节点是叶子节点时返回该左节点的值
代码
1 2 3 4 5 6 7 8 9 10 11 12 13
| public int sumOfLeftLeaves(TreeNode root) { if(root==null) return 0; int ans = 0; if(root.left!=null){ if(root.left.left == null && root.left.right == null) ans += root.left.val; else ans += sumOfLeftLeaves(root.left); } ans+=sumOfLeftLeaves(root.right); return ans; }
|
237. Delete Node in a Linked List
- 题意:删除链表指定的一个节点
- 思路:将该节点的val指向下一个,next指向下一个的下一个
代码
1 2 3 4
| public void deleteNode(ListNode node) { node.val = node.next.val; node.next = node.next.next; }
|
349. Intersection of Two Arrays
- 题意:计算两个数组的交集,所求集合中的元素唯一
- 思路:将第一个数组放入Set1,第二个数组放入Set2时,判断数组中的每个数字是否在Set1中,是的话就放入Set2
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public int[] intersection(int[] nums1, int[] nums2) { Set<Integer> set1 = new HashSet<Integer>(); Set<Integer> set2 = new HashSet<Integer>(); for(int i = 0;i <nums1.length;i++) set1.add(nums1[i]); for(int i = 0;i < nums2.length;i++){ if(set1.contains(nums2[i])) set2.add(nums2[i]); } int[] ans = new int[set2.size()]; int i = 0; for(Integer num : set2) ans[i++] = num; return ans; }
|
387. First Unique Character in a String
- 题意:从左到右找出一个字符串中第一个不重复的字符的下标,不存在返回-1
- 思路:遍历字符串,判断s.indexOf(str[i])==s.lastIndexOf(str[i])
代码
1 2 3 4 5 6 7
| public int firstUniqChar(String s) { char[] str = s.toCharArray(); for(int i = 0; i < str.length;i++) if(s.indexOf(str[i])==s.lastIndexOf(str[i])) return i; return -1; }
|
171. Excel Sheet Column Number
- 题意:将excel sheet的列转出十进制,A->1,AA->27,AB->28
- 思路:就是将26进制转成十进制
代码
1 2 3 4 5 6
| public int titleToNumber(String s) { int ans = 0; for(int i = 0;i < s.length();i++) ans = ans*26 + (s.charAt(i)-'A'+1); return ans; }
|
100. Same Tree
- 题意:判断两个二叉树是否一样(节点一致,节点值一致)
- 思路:递归判断左右子树
代码
1 2 3 4 5 6 7
| public boolean isSameTree(TreeNode p, TreeNode q) { if(p==null && q==null) return true; if(p==null || q==null) return false; if(p.val==q.val) return isSameTree(p.left,q.left) && isSameTree(p.right,q.right); return false; }
|
242. Valid Anagram
- 题意:判断构成两个字符串的字符是否一样
- 思路:一个数组记录第一个字符串的字符出现的次数,遍历第二个字符串,将字符对应的数组的值-1,如果数组中的值有不为0的情况,则说明不一样
代码
1 2 3 4 5 6 7
| public boolean isAnagram(String s, String t) { int[] alphabet = new int[26]; for (int i = 0; i < s.length(); i++) alphabet[s.charAt(i) - 'a']++; for (int i = 0; i < t.length(); i++) alphabet[t.charAt(i) - 'a']--; for (int i : alphabet) if (i != 0) return false; return true; }
|
169. Majority Element
- 题意:有一个数组,其中某个数字至少出现了n/2次,找出这个数字
- 思路:将数组排序,则这个数字一定出现在n/2+1的位置
代码
1 2 3 4
| public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; }
|