LeeCode 242: 有效的字母异位词

题目描述:

给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。若 st 中每个字符出现的次数都相同,则称互为字母异位词。

标签: 哈希表,字符串

时间复杂度: O(N + M),N表示字符串长度,M表示字符种类

建立模型:

  1. 比较 st 的长度,若不相等则不可能为字母异位词 return False,若相等则继续第二步
  2. 统计 st 中各个字符出现的次数(使用两个哈希表保存)
  3. 比较这两个哈希表保存的内容是否一致

代码实现:

# Python3 实现
def isAnagram(self, s: str, t: str) -> bool:
if len(s) != len(t):
return False dict_s, dict_t = {}, {}
for i in range(len(s)):
dict_s[s[i]] = dict_s.get(s[i], 0) + 1
dict_t[t[i]] = dict_t.get(t[i], 0) + 1 # 比较哈希表是否一致
if len(dict_s) != len(dict_t):
return False
for key in dict_s.keys():
if dict_s.get(key) != dict_t.get(key, 0):
return False return True
// Java 实现
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
} Map<Character, String> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
} for (int i = 0; i < t.length(); i++) {
char c = t.charAt(i);
// 出现一次则计数减一
map.put(c, map.getOrDefault(c, 0) - 1); // 当出现字符计数小于0时说明不一致
if (map.get(c) < 0) {
return false;
}
} return true;
}

LeeCode 349: 两个数组的交集

题目描述:

给定两个数组 nums1nums2,返回它们的交集。输出结果中每个元素一定是唯一的。不考虑元素输出的顺序。

标签: 哈希表,数组

时间复杂度: O(N)

建立模型:

  1. 去除原始数组中的重复元素
  2. 求两个数组都包含的元素
  3. 返回结果

代码实现:

# Python3 实现
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
# set(nums1) 去除重复元素
# set.intersection 求交集
return list(set(nums1).intersection(set(nums2)))
// Java 实现
public int[] intersection(int[] nums1, int[] nums2) {
if (num1.length == 0 || nums2.length == 0) {
return new int[0];
} Set<Integer> set = new HashSet<>();
Set<Integer> common = new HashSet<>();
for (int num : nums1) {
set.add(num);
} for (int num : nums2) {
if (set.contains(num)) {
common.add(num);
}
} int[] res = new int[common.size()];
int index = 0;
for (int num : common) {
res[index] = num;
index += 1;
} return res;
}

LeeCode 202: 快乐数

题目描述:

快乐数定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和
  • 然后重复这个过程直到变为1,也可能无限循环但始终变不到1
  • 如果这个过程的结果为1,则原始正整数就是快乐数

标签: 哈希表,数学

建立模型:

  1. 计算正整数的各位置上数字的平方和,并保存至集合中
  2. 重复第1步,直到这个过程的结果为1,或者出现已经保存的在集合中的数字
  3. 结果为1 \(\rightarrow\) 该数是快乐数
  4. 出现已保存在集合中的数字 \(\rightarrow\) 进入无限循环,不是快乐数

代码实现:

# Python3 实现
def isHappy(self, n: int) -> bool:
history = set()
cur = self.getSquares(n) while cur != 1:
if cur in history:
return False
history.add(cur)
cur = self.getSquares(cur) return True def getSquares(self, n: int) -> int:
s = 0
while n:
s += pow(n % 10, 2)
n //= 10
return s
// Java 实现
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
int cur = getSquares(n); while (cur != 1) {
if (set.contains(cur)) {
return false;
} set.add(cur);
cur = getSquares(cur);
} return true;
} public int getSquares(int n) {
int s = 0;
while (n > 0) {
s += Math.pow(n % 10, 2);
n /= 10;
} return s;
}

LeeCode 1: 两数之和

题目描述:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

标签: 哈希表,数组

时间复杂度: O(N)

建立模型:

  1. 从头开始遍历数组 nums
  2. 对于遍历到的每个 num,记录其相加等于 target 需要的另一个值 和 自己的索引位置
  3. 若直至数组末尾都未找到,则该数组不存这样的两个数相加等于 target

代码实现:

# Python3 实现
def twoSum(self, nums: List[int], target: int) -> List[int]:
dict = {}
for index, num in enumerate(nums):
if num in dict:
return [dict.get(num), index]
else:
dict[target - num] = index
return None
// Java 实现
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {
return new int[]{map.get(nums[i]), i};
}
else {
map.put(target - nums[i], i);
}
} return null;
}

LeeCode哈希问题(一)的更多相关文章

  1. 好像leeceode题目我的博客太长了,需要重新建立一个. leecode刷题第二个

    376. Wiggle Subsequence               自己没想出来,看了别人的分析. 主要是要分析出升序降序只跟临近的2个决定.虽然直觉上不是这样. 455. 分发饼干     ...

  2. 算法题思路总结和leecode继续历程

    2018-05-03 刷了牛客网的题目:总结思路(总的思路跟数学一样就是化简和转化) 具体启发点: 1.对数据进行预处理排序的思想:比如8皇后问题 2.对一个数组元素进行比较的操作,如果复杂,可以试试 ...

  3. Leecode刷题之旅-C语言/python-1.两数之和

    开学后忙的焦头烂额(懒得很),正式开始刷leecode的题目了. 想了想c语言是最最基础的语言,虽然有很多其他语言很简单,有更多的函数可以用,但c语言能煅炼下自己的思考能力.python则是最流行的语 ...

  4. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

  5. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  6. Java 哈希表运用-LeetCode 1 Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  7. 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希

    据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...

  8. Oracle 哈希连接原理

    <基于Oracle的sql优化>里关于哈希连接的原理介绍如下: 哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 在Oracle 7.3 ...

  9. SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)

    今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...

  10. BZOJ 3555: [Ctsc2014]企鹅QQ [字符串哈希]【学习笔记】

    3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2046  Solved: 749[Submit][Statu ...

随机推荐

  1. opened by another process write access was denied sourceinsight

    Ubuntu 16.04 安装Samba 和 windows 安装Source Insight weixin_43764544 2021-01-07 15:23:03 23 收藏 文章标签: linu ...

  2. SQL Server 还原数据库

    1.备份要还原的数据库 选择要备份的数据库,右键单击,任务--备份. 2.备份完成后,将数据库还原 3.新建一个空的数据库,比如Gsy_TestNew,将备份的数据库还原到这个新的库上 4.右键单击[ ...

  3. 用JS实现一个简单的购物车小案例

    该案例主要是实现的功能有:添加商品功能,将商品添加到购物车的功能还有将商品删除功能,还有就是移出购物车的功能 该案例实现的难点是将商品添加到购物车列表的时候 数量的增加,当购物车有该商品的时候就进行累 ...

  4. 5G如何加速无人快递?5G智能网关新应用

    网上购物已经是现代生活的主流消费方式之一,伴随网购的繁荣,物流快递行业也进入到一个最火热的时期.而在这之中,有限的快递配送能力和日益增长的配送需求的矛盾持续凸显,因此无人快递车一类的创新应用也应运而生 ...

  5. 关于UPD章节学习的一些感想

    课程看到了UDP, 首先了解UDP的原理模型. 服务端,首先是实例QUdpSocket,也就是UDP套接字,然后,需要绑定.绑定一个任意IP地址,分为IPV4和IPV6.自行选择课程中讲解时绑定的是I ...

  6. SEGGER_RTT_printf()函数添加打印浮点数功能

    SEGGER 的实时传输 (RTT) 是一种用于嵌入式应用程序中交互式用户 I/O 的技术.它以非常高的性能结合了 SWO 和半主机的优势.但是在笔者使用时(RTT v758版本),其暂时不支持浮点数 ...

  7. JWT用户认证体系

    依赖 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifa ...

  8. 抽风的Maven、maven插件及配置

    Idea 配合 Maven使用中有时遇到莫名奇妙的问题,又莫名奇妙的恢复正常.整理如下: 1.删除系统环境变量Maven_Home,只需在IDEA中指定Maven及settings.xml即可. 有时 ...

  9. Flink模式

    Per-job Cluster 该模式下,一个作业一个集群,作业之间相互隔离. 在Per-Job模式下,集群管理器框架用于为每个提交的Job启动一个 Flink 集群.Job完成后,集群将关闭,所有残 ...

  10. 你可能需要的 6 个 React 开发小技巧

    ​ 这是一个可怕的问题,在React中,我们经常会编写条件语句来显示不同的视图,比如这个简单的例子. const App = () => { return ( <> { loadin ...