三天没有写题了,罪过!--Hash Table Start
Posted struggleforit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三天没有写题了,罪过!--Hash Table Start相关的知识,希望对你有一定的参考价值。
(1)Island Perimeter
解题思路:
在矩阵上循环并记录岛(1)的个数;如果当前节点是岛,则检查其是否具有任何右邻居或下邻居,有的话邻居计数加1 ;岛的周长结果为islands * 4 - neighbors * 2.(乘2的原因是因为一条边属于两个邻居)。
代码如下:
1 public class Solution { 2 public int islandPerimeter(int[][] grid) { 3 int islands = 0; 4 int neighbours =0; 5 for (int i = 0; i < grid.length; i++) { 6 for (int j = 0; j < grid[i].length; j++) { 7 if (grid[i][j] == 1) { 8 islands++; 9 if (i < grid.length - 1 && grid[i+1][j] == 1) neighbours++; 10 if (j < grid[0].length - 1 && grid[i][j+1] == 1) neighbours++; 11 } 12 } 13 } 14 return islands * 4 - neighbours * 2; 15 } 16 }
代码中if(j<grid[i].length&&。。。)要注意!!!
(2)Single Number
解题思路:
在java程序里面的异或用法: 相同输出0,不同输出1。
例如: System.out.println(1^1); 输出0 System.out.println(1^2);输出3,因为最后2个低位都不一样,所以输出3 。
异域的概念是相同为0不同为1.如果两个数值异或后的值相同,异或前可能不同。 比如二进制:0010^0001=0011 而0000^0011=0011。 异或要慎用。
使用异或运算上述两个性质来解本题:自己与自己异或结果为0;异或满足交换律。
代码如下:
1 public class Solution { 2 public int singleNumber(int[] nums) { 3 if(nums == null || nums.length == 0) { 4 return -1; 5 } 6 int rst = 0; 7 for (int i = 0; i < nums.length; i++) { 8 rst ^= nums[i]; 9 } 10 return rst; 11 } 12 }
(3)Find the Difference
最优解题思路:依旧是使用异或运算,除了字符串t中的多余字符外,其余字符都可以在异或运算中消除掉。
代码如下:
1 public class Solution { 2 public char findTheDifference(String s, String t) { 3 char rst = 0x00; 4 for (int i = 0; i < s.length(); i++) { 5 rst = (char)(rst ^ s.charAt(i)); 6 } 7 for (int i = 0; i < t.length(); i++) { 8 rst = (char)(rst ^ t.charAt(i)); 9 } 10 return rst; 11 } 12 }
注意字符串的长度s.length(),取某个字符s.charAt(i)的使用。
正常思路:用两个计数数组统计s和t的字母出现次数,不一样的那个就是答案。
代码如下:
1 public char findTheDifference(String s, String t) { 2 int count1[] = new int[26]; 3 int count2[] = new int[26]; 4 int i; 5 for (i = 0; i < s.length(); i++) { 6 count1[s.charAt(i)-\'a\']++; 7 } 8 for (i = 0; i < t.length(); i++) { 9 count2[t.charAt(i)-\'a\']++; 10 } 11 for (i = 0; i < 26; i++) { 12 if (count1[i] != count2[i]) 13 return (char) (\'a\' + i); 14 } 15 return 0; 16 }
(4)Intersection of Two Arrays
解题思路一:
不能有重复数字,就想到使用数据类型Set。
逻辑原理: 数组一的数据存入hashset;遍历数组二如果set中存在该数据存入新的hashset中,同时从set中remove该元素,防止多个元素重复;遍历新hashset转变为array返回数据。
代码如下:
1 public class Solution { 2 public int[] intersection(int[] nums1, int[] nums2) { 3 if (nums1 == null || nums2 == null) { 4 return null; 5 } 6 7 Set<Integer> set = new HashSet<>(); 8 for (int i = 0; i < nums1.length; i++) { 9 set.add(nums1[i]); 10 } 11 12 Set<Integer> insertset = new HashSet<>(); 13 for (int i = 0; i < nums2.length; i++) { 14 if (set.contains(nums2[i])) { 15 insertset.add(nums2[i]); 16 set.remove(nums2[i]);//防止元素重复 17 } 18 } 19 //变为数组返回 20 int[] array = new int[insertset.size()]; 21 int index = 0; 22 for (Integer num : insertset) { 23 array[index++] = num; 24 } 25 return array; 26 27 } 28 }
解题思路二:
1)对数组nums1进行排序;
2)对数组nums2进行排序;
3)遍历数组nums1和nums2中元素,并比较对应的元素,
- 若相等,则判断其值是否与结果中最后保存的元素(用mark记录)是否相等,相等则直接变化两个索引,否则将该值保存到结果中,并变化两个索引
- 不等,则变化较小元素对应的索引即可。
代码如下:
1 public int[] intersection(int[] nums1, int[] nums2){ 2 Arrays.sort(nums1); 3 Arrays.sort(nums2); 4 ArrayList result = new ArrayList(); 5 int mark = 0; 6 for (int i = 0, j = 0; i < nums1.length && j < nums2.length; ){ 7 if (nums1[i] == nums2[j]){ 8 if (result.size() == 0 || nums1[i] != mark){ 9 result.add(nums1[i]); 10 mark = nums1[i]; 11 } 12 i++; 13 j++; 14 } else if (nums1[i] < nums2[j]) { 15 i++; 16 } else { 17 j++; 18 } 19 } 20 int[] res = new int[result.size()]; 21 for (int i = 0; i < result.size(); i++){ 22 res[i] = (int) result.get(i);//字符类型转换 23 } 24 return res; 25 }
以上是关于三天没有写题了,罪过!--Hash Table Start的主要内容,如果未能解决你的问题,请参考以下文章
[CF1292C] Xenon's Attack on the Gangs
JS组件系列——表格组件神器:bootstrap table
剑指Offer数据结构之Hash Table和图[Python版]