首页 > 代码库 > 三天没有写题了,罪过!--Hash Table Start

三天没有写题了,罪过!--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 }
View Code

(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 }
View Code

(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 }
View Code

注意字符串的长度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 }  
View Code

(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 }
View Code

 

三天没有写题了,罪过!--Hash Table Start