(1)Island Perimeter

解题思路:

在矩阵上循环并记录岛(1)的个数;如果当前节点是岛,则检查其是否具有任何右邻居或下邻居,有的话邻居计数加1 ;岛的周长结果为islands * 4 - neighbors * 2.(乘2的原因是因为一条边属于两个邻居)。

代码如下:

 public class Solution {
public int islandPerimeter(int[][] grid) {
int islands = 0;
int neighbours =0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
if (grid[i][j] == 1) {
islands++;
if (i < grid.length - 1 && grid[i+1][j] == 1) neighbours++;
if (j < grid[0].length - 1 && grid[i][j+1] == 1) neighbours++;
}
}
}
return islands * 4 - neighbours * 2;
}
}

代码中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;异或满足交换律。

代码如下:

 public class Solution {
public int singleNumber(int[] nums) {
if(nums == null || nums.length == 0) {
return -1;
}
int rst = 0;
for (int i = 0; i < nums.length; i++) {
rst ^= nums[i];
}
return rst;
}
}

(3)Find the Difference

最优解题思路:依旧是使用异或运算,除了字符串t中的多余字符外,其余字符都可以在异或运算中消除掉。

代码如下:

 public class Solution {
public char findTheDifference(String s, String t) {
char rst = 0x00;
for (int i = 0; i < s.length(); i++) {
rst = (char)(rst ^ s.charAt(i));
}
for (int i = 0; i < t.length(); i++) {
rst = (char)(rst ^ t.charAt(i));
}
return rst;
}
}

注意字符串的长度s.length(),取某个字符s.charAt(i)的使用。

正常思路:用两个计数数组统计s和t的字母出现次数,不一样的那个就是答案。

代码如下:

 public char findTheDifference(String s, String t) {
int count1[] = new int[26];
int count2[] = new int[26];
int i;
for (i = 0; i < s.length(); i++) {
count1[s.charAt(i)-'a']++;
}
for (i = 0; i < t.length(); i++) {
count2[t.charAt(i)-'a']++;
}
for (i = 0; i < 26; i++) {
if (count1[i] != count2[i])
return (char) ('a' + i);
}
return 0;
}

(4)Intersection of Two Arrays

解题思路一:

不能有重复数字,就想到使用数据类型Set。 
逻辑原理: 数组一的数据存入hashset;遍历数组二如果set中存在该数据存入新的hashset中,同时从set中remove该元素,防止多个元素重复;遍历新hashset转变为array返回数据。

代码如下:

 public class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if (nums1 == null || nums2 == null) {
return null;
} Set<Integer> set = new HashSet<>();
for (int i = 0; i < nums1.length; i++) {
set.add(nums1[i]);
} Set<Integer> insertset = new HashSet<>();
for (int i = 0; i < nums2.length; i++) {
if (set.contains(nums2[i])) {
insertset.add(nums2[i]);
set.remove(nums2[i]);//防止元素重复
}
}
//变为数组返回
int[] array = new int[insertset.size()];
int index = 0;
for (Integer num : insertset) {
array[index++] = num;
}
return array; }
}

解题思路二:

1)对数组nums1进行排序;

2)对数组nums2进行排序;

3)遍历数组nums1和nums2中元素,并比较对应的元素,

  • 若相等,则判断其值是否与结果中最后保存的元素(用mark记录)是否相等,相等则直接变化两个索引,否则将该值保存到结果中,并变化两个索引
  • 不等,则变化较小元素对应的索引即可。

代码如下:

 public int[] intersection(int[] nums1, int[] nums2){
Arrays.sort(nums1);
Arrays.sort(nums2);
ArrayList result = new ArrayList();
int mark = 0;
for (int i = 0, j = 0; i < nums1.length && j < nums2.length; ){
if (nums1[i] == nums2[j]){
if (result.size() == 0 || nums1[i] != mark){
result.add(nums1[i]);
mark = nums1[i];
}
i++;
j++;
} else if (nums1[i] < nums2[j]) {
i++;
} else {
j++;
}
}
int[] res = new int[result.size()];
for (int i = 0; i < result.size(); i++){
res[i] = (int) result.get(i);//字符类型转换
}
return res;
}

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

  1. CMU-15445 LAB1:Extendible Hash Table, LRU, BUFFER POOL MANAGER

    概述 最近又开了一个新坑,CMU的15445,这是一门介绍数据库的课程.我follow的是2018年的课程,因为2018年官方停止了对外开放实验源码,所以我用的2017年的实验,但是问题不大,内容基本 ...

  2. 学习hash_map从而了解如何写stl里面的hash函数和equal或者compare函数

    ---恢复内容开始--- 看到同事用unordered_map了所以找个帖子学习学习 http://blog.sina.com.cn/s/blog_4c98b9600100audq.html (一)为 ...

  3. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  4. 【转载】一步一步写算法(之hash表)

    转载自:http://blog.csdn.net/feixiaoxing/article/details/6885657 [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaox ...

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

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] hash表,有时候也被称为散列表.个人觉得,hash表是介于链表和二叉树之间的一种中间结构.链 ...

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

    地狱的镰刀 bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){ ...

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

    bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){alert( ...

  8. feign三:覆写feign的默认配置及feign的日志

    feign三:覆写feign的默认配置及feign的日志 默认配置复写 本项目地址:http://192.168.1.103:7601 本例是通过feign调用 eureka项目中的/eureka/a ...

  9. 使用Typescript重构axios(三十二)——写在最后面(总结)

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

随机推荐

  1. ionic react-native和native开发移动app那个好

    ionic react-native和native开发移动app那个好 ? 移动端开发如何选型?这里介绍一下我眼中的ionic,react-native,native 三种移动端开发选型对比.欢迎大家 ...

  2. 2015GitWebRTC编译实录11

    2015.07.21 ilbc 编译通过注意有几个win32打头的文件,其实都是要编进去的[429/1600 ] CC obj ilbc.abs_quant.o[430/1600 ] CXX obj ...

  3. JSONObject转换JSON--将Date转换为指定格式

    项目中,经常会用JSONObject插件将JavaBean或List<JavaBean>转换为JSON格式的字符串,而JavaBean的属性有时候会有java.util.Date这个类型的 ...

  4. 关于js判断鼠标移入元素的方向--解释

    一开始我是这么想的,将待移入的元素分割四块,用mousemove获取第一次鼠标落入的区域来判断鼠标是从哪个方向进去的. 所以只要写个算法来判断鼠标的值落入该元素的区域就可以得出鼠标移入的方向,如下图: ...

  5. 非常好的分页组建layPage和 layer层特效

    http://layer.layui.com/ http://sentsin.com/layui/laypage/

  6. 关于SCRUM站立会议

    查询过后对SCRUM站立会议有了初步的了解 站立会议:在敏捷流程的冲刺阶段中,每一天都会举行项目状况会议,强迫每个人向同伴报告进度,迫使大家把问题摆在明面上,这个会议被称为“scrum”或“每日站立会 ...

  7. [原创]cocos2d-x研习录-第二阶 概念类之布场层类(CCLayer)

    上面说场景CCScene相当于一个大容器,那么布景层类CCLayer就是大容器里的若干个小容器.每个游戏场景CCScene会有很多层CCLayer,每一层CCLayer负责各自的任务.看一下CCLay ...

  8. sublime test 3 使用及常用插件

    1.家里不能安装问题 公司可以安装,但回到家里安装不上 package control,看了是网络方面原因,具体就没去了解... 所有建议: 安装后在sublime text目录下 新建 Date目录 ...

  9. 029. aps.net中DataView中详细信息的跳转显示

    点击当前页面的连接, 跳转到另一个页面, 然后进行更新删除等一系列操作 主要代码: <%@ Page Language="C#" AutoEventWireup=" ...

  10. IE10、IE11解决不能播放Flash的问题!

    http://jingyan.baidu.com/article/154b46315421b528ca8f41e4.html ie的问题向来是windows系统的传统问题之一.几乎每个版本的windo ...