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

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

时间: 2024-10-12 04:38:57

三天没有写题了,罪过!--Hash Table Start的相关文章

UVA_11877.第三次比赛C题:The Coco Cola

题目: 有一个coco cola小店,你可以用三个空瓶换一瓶coco cola饮料,如果你有n个空瓶,你可以喝到多少瓶饮料? 输入输出要求: intput:最多有10组案例,每组输入一个整数,0不被处理操作. Output:每组案例输出你能喝到的饮料数. sample intput: 3 10 81 0 sanple output: 1 5 40 代码如下: #include<iostream> #include<cstdio> using namespace std; int m

2018 HDU多校第三场赛后补题

2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube 题意: 在画布上画一个三维立方体. 题解: 模拟即可. 代码: #include <bits/stdc++.h> using namespace std; int a, b, c, R, C; char g[505][505]; int main () { int T; cin >>

JavaScript--------------------jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画

bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){alert("ok");}); live(type,[data],fn) 给所有匹配的元素附加一个事件处理函数,即使这个元素是以后再添加进来的 $("a").live("click",function(){alert("ok");}); de

一步一步写算法(之hash表)

[ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] hash表,有时候也被称为散列表.个人觉得,hash表是介于链表和二叉树之间的一种中间结构.链表使用十分方便,可是数据查找十分麻烦:二叉树中的数据严格有序,可是这是以多一个指针作为代价的结果.hash表既满足了数据的查找方便,同一时候不占用太多的内容空间,使用也十分方便. 打个比方来说,全部的数据就好像许很多多的书本.假设这些书本是一本一本堆起来的,就好像链表或者线性表一样,整个数据会显得非

01-(2)数据结构- 一步一步写算法(之hash表)

hash表,有时候也被称为散列表.个人认为,hash表是介于链表和二叉树之间的一种中间结构.链表使用十分方便,但是数据查找十分麻烦:二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果.hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便. 打个比方来说,所有的数据就好像许许多多的书本.如果这些书本是一本一本堆起来的,就好像链表或者线性表一样,整个数据会显得非常的无序和凌乱,在你找到自己需要的书之前,你要经历许多的查询过程:而如果你对所有的书本进行编号,并且把这些书本

ZZNU 我只看看不写题 贪心?dp?不懂

G : 我只看看不写题 Progress Bar 时间限制:1 Sec 内存限制:128 MiB 提交:221 答案正确:59 题目描述 伴随着科技的发展,我们的生活也越来越多姿多彩,随着手机的普及,各种交友软件也在快速的发展. 小a是个老实人,当然只是自己理解而已,其实小a是个不折不扣的渣男.因为他在有女朋友的同时,还在疯狂的撒网,利用各种交友软件寻求更适合自己的伴侣. 小a女朋友当然不是省油的灯,自然了解小a的本性,所以在每次见面时就会翻看小a的软件记录,来了解小a近期的状况,机智的小a当然

随机产生三十道四则运算题程序

#include<stdio.h>#include<stdlib.h>#include<time.h>int main(){ int x,y,z,t,i; srand(time(NULL)); printf("三十道四则运算题\n"); for(i=0;i<30;i++) { x=rand()%100; y=rand()%100; z=rand()%4; switch(z) { case 0: printf("%d+%d=\n&quo

PHP内核探索之变量(3)- hash table

在PHP中,除了zval, 另一个比较重要的数据结构非hash table莫属,例如我们最常见的数组,在底层便是hash table.除了数组,在线程安全(TSRM).GC.资源管理.Global变量.ini配置管理中,几乎都有Hash table的踪迹(上一次我们也提到,符号表也是使用Hash table实现的).那么,在PHP中,这种数据有什么特殊之处,结构是怎么实现的? 带着这些问题,我们开始本次的内核探索之旅. 本文主要内容: Hash table的基本介绍 PHP底层Hash tabl

C 语言构造hash table 解 LC majority element问题

Leetcode上 majority element这题是 有 时间O(N), 空间O(1)的解的. https://leetcode.com/problems/majority-element/ 用hash table来解则为 时间O(N), 空间O(N). 如果是Java里 用HashMap很方便了. 有位同学问怎么用c语言来构造hash table. 我就随手写了一个: typedef struct Node { int val, count; } Node; typedef struct