zoukankan      html  css  js  c++  java
  • 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

    代码中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 }
    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

     解题思路二:

    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 }
    View Code
  • 相关阅读:
    idea的常识
    开发工具
    常用的正则表达式
    比较器
    索引
    final区别
    GC
    String StringBuffer
    类库
    线程的操作状态
  • 原文地址:https://www.cnblogs.com/struggleli/p/6155231.html
Copyright © 2011-2022 走看看