LeetCode:经典题之389 题解与延伸

系列目录

88.合并两个有序数组
52.螺旋数组
567.字符串的排列
643.子数组最大平均数
150.逆波兰表达式
61.旋转链表
160.相交链表
83.删除排序链表中的重复元素
389.找不同
1491.去掉最低工资和最高工资后的工资平均值
896.单调序列
206.反转链表
92.反转链表II
141.环形链表
142.环型链表


目录

  • 系列目录
  • 389.找不同
    • 哈希表


389.找不同

🌟数组+哈希表/计数法

原题链接

方法一 哈希表
class Solution {
public:
    char findTheDifference(string s, string t) {
        vector<int> table(26, 0);
        for (auto& ch: s)
            table[ch - 'a'] ++;
        
        for (auto& ch: t) {
            table[ch - 'a'] --;
            if (table[ch - 'a'] < 0)
                return ch;
        }

        // 这里return -1;也是可以的
      	// 字符串相关的题的错误指示符用——' '——较好
      	// 也就是return ' ';
      	return ' ';
    }
};

哈希表

简单介绍
一、种类:

1、存储结构:开放寻址法(更推荐)和拉链法

2、字符串哈希方式


二、主要作用:

将一个较大的空间或值域(通过一定的对应法则)映射到比较小的空间或值域

[ − 1 0 9 , 1 0 9 ] − > [ 1 0 5 , 0 ) [-10^9, 10^9] \quad->\quad[10^5, 0) [109,109]>[105,0)


三、一般的实现方式:

1、通过一个哈希函数h(x)映射

a. h(x)常用写法

对x取模运算,模上数组的长度N

h(x) = x mod N(N一般取成尽可能远离2的整数次幂的质数)

// 寻找合适长度 N的方法 
// 循环找到大于10w(1e5)的第一个整数
int main() {
    // 无上约束条件
	for (int i = 100000;; i ++) {
		bool flag = true;
		
    for (int j = 2; j * j <= i; j ++)
    	if (i % j == 0) {
        	flag = false;
        	break;
   		}
    
    if (flag) {
      cout << i << endl;
      break;
    }
    
  	return 0;
  }
}
b.  哈希碰撞(哈希冲突)

eg. h(5) = 2; h(10) = 2;

​ 用拉链法处理哈希冲突

拉链法:开一个一维数组存储哈希值,并辅助一个单链表;


一起来看一道例题吧~

AcWing.840 模拟散列表

维护一个集合,支持如下几种操作:

I x,插入一个整数 x;
Q x,询问整数 x 是否在集合中出现过;
现在要进行 N 次操作,对于每个询问操作输出对应的结果

输入格式

第一行包含整数 N,表示操作数量

接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种

输出格式

对于每个询问指令 Q x,输出一个询问结果,如果 x 在集合中出现过,则输出 Yes,否则输出 No

每个结果占一行

数据范围

1 ≤ N ≤ 105
−109 ≤ x ≤ 109

输入样例:

5
I 1
I 2
I 3
Q 2
Q 5

输出样例:

Yes
No
#include <bits/stdc++.h>

using namespace std;

// 通过上述方法或观察法
const int N = 100003;

// e[] 表示当前节点的值;ne[] 表示下一个节点的地址
// idx 表示当前用到哪个位置
int h[N], e[N], ne[N], idx;

// 插入x
void add(int x)
{
    // 构造一个哈希函数,将x映射到[0,1e5)这个区间里
    // 为什么这么定义 k——见注解
    int k = (x % N + N) % N;    	
    e[idx] = x;
    ne[idx] = h[k];
    h[k] = idx ++;
}

// 查询x是否存在,返回一个布尔类型
bool contain(int x)                
{	

    int k = (x % N + N) % N;
    for (int i = h[k]; i != -1; i = ne[i])
        if (e[i] == x)
            return true;
    
    // 这里略写 else
    return false;               	
}

// 拉链法
int main()
{
    int n;
    scanf("%d", &n);
    
    // 空指针一般用-1表示——将所有的槽清空
    memset(h, -1, sizeof h);    
    
    while (n --) {
        char op[2];            
        
        int x;
        // 若是用scanf的读入方式,尽量读入字符串;
        // scanf会自动过滤掉字符串中的回车、空格、制表符等
        scanf("%s%d", op, &x);
        
        // 指针和整数比较出错;(禁止指针和整数进行比较)
        // * 表示op是一个指向char类型的指针(变量)
        if (*op == 'I') {
        	add(x);     
        } else {                       
            if (contain(x)) 
            	puts("Yes");
            else 
            	puts("No");				
       	}
    }
    
    return 0;  
}

注解:

(x % N + N) / N

  • C++中的模运算
    • 若x为负,则余数(运算结果)为负
    • 若x为证,则余数为正
  • +N的目的
    • 将余数(可能为负的)变为正数

memset(h, -1, sizeof h); // 空指针一般用-1表示——将所有的槽清空

初始化

scanf("%s%d", op, &x)

若使用scanf读入方式,应尽量读入字符串
读入字符串,scanf会自动过滤掉空格、回车、制表符等,降低出错的概率;
一般不用scanf读入字符

char *op

a.如果不加星号*
会报错:指针和整数比较出错;(禁止指针和整数进行比较)
b.这里的*+指针(字符串)表示:(指针)op是一个指向char类型的指针变量


四、基本操作(创建,销毁,增删 查——创销增删查)

添加——void add(int x)

删除——remove(int x)

​ 构造一个布尔类型的函数,在h(x)上打上标记,从逻辑上删除x(物理上并没有删除)

查找——bool contain(int x)

​ a.找到h(x)所在的槽

​ b.遍历这个槽存的值,以及对应的单链表,比较值是否相同,判断是否存在x



方法二 求和
class Solution {
public:
  	char findTheDifference(string s, string t) {
      // accumulate of ..
      int as = 0, at = 0;
      for (auto ch: s)
        	as += ch;
      
      for (auto ch: t)
        	at += ch;
      
      return at - as;
    }
};



异或(XOR)运算

异或运算对任何给定的数字x 的性质,即x ^ x = 0x ^ 0 = x

LaTeX中,

\oplus 表示A和B的异或

\bigoplus 通常用于表示多个元素的异或

x ⊕ x = 0 x ⊕ 0 = x x\oplus x = 0\\x\oplus0=x xx=0x0=x

如果对两个相同的字符串进行异或,结果将是0;

如果再对结果和第三个字符串(即那个不同的字符)进行异或,结果将是那个不同的字符

此方法只适用于找出两个字符串之间的一个差异字符

方法三 异或运算 
// 类似方法二
class Solution {
public:
    char findTheDifference(string s, string t) {
      	// 声明一个char变量,用来存最后的结果
        char res = 0;
        for (auto ch: s)
            res ^= ch;

        for (auto ch: t) 
            res ^= ch;

        return res;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/746205.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Navicat Premium Lite绿色免费版

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Navicat Premium Lite概述 Navicat 最近推出了一款名为 Navicat Premium Lite 的免费数据库管理开发工具&#xff0c;专为入门级用户设计。这款工具虽然在功能上与 Navicat…

转让北京资产评估公司变更需要什么条件和要求

北京资产评估公司是有限责任公司。因为有限责任公司具有人合属性&#xff0c;股东的个人信用及相互关系直接影响到公司的风格甚至信誉&#xff0c;所以各国公司法对有限责任公司股东向公司外第三人的转让股权&#xff0c;多有限制性规定。大致可分为法定限制和约定限制两类。公…

Centos7虚拟机

Centos 7 安装 1 镜像下载1.1 官网下载1.2 阿里云镜像下载 2 环境的安装2.1 打开我们的虚拟机&#xff0c;点击文件进行新建2.2 选择典型之后&#xff0c;下一步2.3 选择稍会安装操作系统2.4 勾选Linux&#xff0c;并且选择CentOS 7的版本2.5 设定我们虚拟机的名称和安装位置2.…

python实现可视化大屏(django+pyechars)

1.实现效果图 2.对数据库进行迁移 python manage.py makemigrations python manage.py migrate 3.登录页面 {% load static%} <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"…

文件管理器加载缓慢-禁用文件类型自动发现功能

文件管理器加载缓慢-禁用文件类型自动发现功能 右键“Shell”项&#xff0c;选择新建“字符串值” “FolderType”&#xff0c;数值为 NotSpecified。

文字实录|Checkout.com大中华区总经理项尧:品牌全球化发展中的支付运营策略

大家好&#xff0c;很高兴在此次【品牌全球化营销增长峰会】与大家一起分享和交流。 我叫项尧&#xff0c;是 Checkout.com 大中华区的总经理&#xff0c;在支付领域有将近15年的经验。 我们 Checkout.com 是一家总部位于英国的支付公司&#xff0c;专注于线上收单&#xff0…

旧衣回收小程序开发:回收市场的新机遇

当下&#xff0c;旧衣服回收已经成为了一种流行趋势&#xff0c;居民都将闲置的衣物进行回收&#xff0c;旧衣回收市场规模在不断增加。随着市场规模的扩大&#xff0c;为了让居民更加便利地进行回收&#xff0c;线上回收小程序也应运而生&#xff0c;为大众打造了一个线上回收…

程序员学长 | 快速学会一个算法,RNN

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;快速学会一个算法&#xff0c;RNN 今天给大家分享一个超强的算法模型&#xff0c;RNN 循环神经网络&#xff08;Recurrent Neural Network, RNN&…

新改进!LSTM与注意力机制结合,性能一整个拿捏住

众所周知&#xff0c;LSTM并不能很好地处理长序列和重要信息的突出&#xff0c;这导致在某些情况下性能不佳。而注意力机制模拟人类视觉注意力机制的特点可以很好地解决这个问题。 说具体点就是&#xff0c;注意力机制通过权重分布来决定应该关注输入序列中的哪些部分&#xf…

完整代码Python爬取豆瓣电影详情数据

完整代码Python爬取豆瓣电影详情数据 引言 在数据科学和网络爬虫的世界里&#xff0c;豆瓣电影是一个丰富的数据源。在本文中&#xff0c;我们将探讨如何使用Python语言&#xff0c;结合requests和pyquery库来爬取豆瓣电影的详情页面数据。我们将通过一个具体的电影详情页面作…

3d渲染软件有哪些(2),渲染100邀请码1a12

3D渲染软件有很多&#xff0c;上次我们介绍了几个&#xff0c;这次我们接着介绍。 1、Arnold Arnold渲染器是一款基于物理算法的电影级渲染引擎&#xff0c;它具有渲染质量高、材质系统丰富、渲染速度快等特点&#xff0c;是3D设计师的极佳选择。2、Octane Render Octane Ren…

云3D渲染:深度剖析技术原理、优势及其在各行业的广泛应用

云3D渲染技术&#xff0c;在数字化转型的大潮中&#xff0c;以其显著的优势和广阔的应用潜力&#xff0c;正在深刻地重塑多个行业的未来。它不仅为电影特效、建筑设计、游戏开发和虚拟现实等领域注入了前所未有的视觉震撼&#xff0c;还促进了创意思维与前沿技术的紧密结合&…

【编译原理】总览

1 字母表 字母表&#xff1a; 用∑表示&#xff0c;它是一个有穷符号集合 符号&#xff1a;字母、数字、标点符号... 例如&#xff1a;二进制字母表为{0&#xff0c;1}&#xff0c;ASCII字符集 2 字母表的运算 字母表上的乘积&#xff1a; ∑1∑2{ab | a属于∑1&#xff0c;b…

气流流型烟雾模型研究相关法规要求及拍摄注意事项

气流模式可视化提供制药设施中实际气流模型的视觉记录。它是目前最广泛接受的、证明关键工艺区域的气流模型满足监管期望的方法。此外&#xff0c;气流模型可视化允许多个职能组织发现气流设计和功能的有效性和意义&#xff0c;特别是在关键领域。 与气流模型相关的法规指南要求…

数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南

文章目录 &#x1f4d1;引言一、Elasticsearch Pipeline的原理二、Elasticsearch Pipeline的使用2.1 创建 Pipeline2.2 使用 Pipeline 进行索引2.3 常用的 Processor 三、实际应用场景3.1 日志数据处理3.2 数据清洗和标准化3.3 数据增强 四、最佳实践4.1 性能优化4.2 错误处理4…

晶方科技:台积电吃饱,封装迎春?

半导体产业链掀起涨价潮&#xff0c;先进封装迎接利好。 这里我们来聊国内先进封装企业——晶方科技。 近期&#xff0c;由于产能供不应求&#xff0c;台积电决定上调先进封装产品价格&#xff0c;还表示订单已经排到2026年。 大哥吃不下了&#xff0c;剩下的订单全都是空间。…

GMSB文章四:微生物组多样性分析

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 Alpha多样性主要关注的是样品内部的多样性&#xff0c;即一个特定区域或生态系统内的物种丰…

加油卡APP系统开发,优惠加油!

在当下的社会生活中&#xff0c;汽车已经成为了家家户户必备的出行工具&#xff0c;骑车加油也成为了居民生活中不可或缺的事情。为了让大众更加优惠加油&#xff0c;在线加油卡系统成为了一个重要的加油渠道&#xff01; 在线加油卡系统是一个移动应用程序&#xff0c;用户可…

记一次elementui时间线的实现

实现效果 点击展开&#xff0c;每次累加五条数据进行展示 实现思路 起始本质上就是一个分页查询&#xff0c;只不过按新的形式展示&#xff0c;然后也不统计总数&#xff0c;每次只展示固定的5条数据点击加载更多&#xff0c;就展示下一页&#xff0c;页的页数进行1&#xff…

回购注销高管减持,东软集团的“大手笔”有意义吗?

文&#xff1a;互联网江湖 作者&#xff1a;刘致呈 作为老牌软件巨头&#xff0c;东软集团这两年的业绩着实有些不够看。 看财报数据&#xff0c;22年东软集团营收94.66亿&#xff0c;净亏损3.47亿&#xff0c;扣非净利利润-5.30亿。23年&#xff0c;集团营收105.44亿&#x…