散列(哈希)及其练习题(基础)

news2024/12/26 22:09:54

目录

散列

字符出现次数

 力扣经典题:两数之和

 集合运算

并 

差 

 字符串的出现次数


散列

导入:

有N个数和M个数,如何判断M个数中每个数是否在N中出现?

思想:空间换时间

创建hashtable,以N个数本身为索引(数组下标)构建 bool hashtable

输入x的过程中,hashtable[x]=True(若要计算出现次数,换成++)

但终归是有局限性!数字只能是整数,还不能太大,等等。

散列函数:平房区中法、取余数……

可能会冲突:(即:不是单射了)

 字符串哈希:借鉴26进制的推广:62进制

字符是否出现

 如何判断输完了?

本地devc++我可以说:c1!='\n',c1!=' ','a'<=c1<='z'都能跑,如

#include<stdio.h>
#include<string>
using namespace std;
int main()
{
	printf("%d",'\n'>='a');
//    char c1[27];
char c1;
    char c2[27]={0};
int i=0;
scanf("%c",&c1);
while(c1>='a'&&c1<='z')
{
	c2[c1-'a']++;
	scanf("%c",&c1);
}
for(int j=0;j<26;j++)
if(c2[j]>0) printf("%c %d\n",'a'+j,c2[j]);
}

然而网站上不行,得用while(scanf("%c",&c1)!=EOF)
 

#include<stdio.h>
#include<string>
using namespace std;
int main()
{
//    char c1[27];
char c1;
    char c2[27]={0};
int i=0;
// scanf("%c",&c1);
while(scanf("%c",&c1)!=EOF)
{
	c2[c1-'a']++;
	// scanf("%c",&c1);
}
for(int j=0;j<26;j++)
if(c2[j]>0) printf("%c %d\n",'a'+j,c2[j]);
}

 这个本地不能跑了。。

行吧,得改头换面用cstring

字符出现次数

 这里我忘了这个:

就算你定义char a[1000],如果赋值“avx”,仍然可以使用长度strlen,仍为3

我的代码

#include<stdio.h>
#include<cstring>
using namespace std;
int main()
{
	char s1[1001],s2[1001];
	int s[26]={0};
	scanf("%s",&s1);scanf("%s",&s2);
	for(int i=0;s1[i]>='a'&&s1[i]<='z'&&i<1001;i++)
	s[s1[i]-'a']=1;
	for(int i=0;s2[i]>='a'&&s2[i]<='z'&&i<1001;i++)
{
		if(i==0)		printf("%d",s[s2[i]-'a']);

	else	printf(" %d",s[s2[i]-'a']);
}
	
	
}

 答案

#include <cstdio>
#include <cstring>

const int MAXN = 26;
const int MAXL = 1001;
char str1[MAXL], str2[MAXL];
bool hashTable[MAXN] = {false};

int getHashKey(char c) {
    return c - 'a';
}

int main () {
    scanf("%s%s", str1, str2);
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    for (int i = 0; i < len1; i++) {
        hashTable[getHashKey(str1[i])] = true;
    }
    for (int i = 0; i < len2; i++) {
        printf("%d", hashTable[getHashKey(str2[i])]);
        printf(i < len2 - 1 ? " " : "\n");
    }
    return 0;
}

 力扣经典题:两数之和

简单版

 我的代码(devc++int数组长度设为1000000报错,但是网上通过了)

 #include<stdio.h>
#include<cstring>
using namespace std;
int main()
{
int n,k;
scanf("%d %d",&n,&k);
int A[n];
int h[1000000]={0};
int ans=0;
int a0=0;
for(int i=0;i<n;i++)
{
	scanf("%d",&a0);
	A[i]=a0;
	h[A[i]]++;	 
}

for(int i=0;i<n;i++)
{
if(k>=A[i])
{
if(A[i]<=k-A[i])
{
	if(A[i]==k-A[i])
	{
	if(h[A[i]]>1)
	ans++;//printf("-%d-",A[i]);	
	}
	else if(h[k-A[i]]>0) ans++;//printf("-%d-",A[i]);
}
else break;
}
}
printf("%d",ans);

	
	
}

答案(他是遍历整个,再除以二) 

#include <cstdio>

const int MAXN = 100000;
const int MAXK = 1000001;
int a[MAXN], hashTable[MAXK] = {false};

int main () {
    int n, k;
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
        hashTable[a[i]] = true;
    }
    int ans = 0;
    for (int i = 0; i < n; i++) {
        if (k - a[i] >= 0 && hashTable[k - a[i]]) {
            ans++;
        }
    }
    printf("%d", ans / 2);
    return 0;
}

 集合运算

思路:第一个数组构造哈希表,然后遍历第二个,输出值为1者

数组长度10001错误,数组长度20000,通过。。

#include<stdio.h>
#include<cstring>
using namespace std;
int main()
{
int n1,n2;
scanf("%d %d",&n1,&n2);
int A[n1],B[n2],h1[20010],h2[20010];
int a0=0;
for(int i=0;i<n1;i++)
{
	scanf("%d",&a0);
	A[i]=a0;
	h1[A[i]]++;	 
}
bool flag=0;
for(int i=0;i<n2;i++)
{
	scanf("%d",&a0);
	B[i]=a0;
	//求交集:
	if(h1[a0]) 
	{
		if(flag) printf(" %d",a0);
		else printf("%d",a0);
		flag=1;
	} 
//	h2[B[i]]++;	 
}



	
	
}

并 

 思路:遍历第一个数组构造哈希表,然后遍历第二个,把第一个为0的但第二个出现的数字的哈希值改为1,最后遍历整个表,输出值为1的

#include<stdio.h>
#include<cstring>
using namespace std;
int main()
{
int n1,n2;
scanf("%d %d",&n1,&n2);
int A[n1],B[n2],h1[20000]={0},h2[20000]={0};
int a0=0;
for(int i=0;i<n1;i++)
{
	scanf("%d",&a0);
	A[i]=a0;
	h1[A[i]]++;	 
}
bool flag=0;
for(int i=0;i<n2;i++)
{
	scanf("%d",&a0);
	B[i]=a0;
	//求交集:
//	if(h1[a0]) 
//	{
//		if(flag) printf(" %d",a0);
//		else printf("%d",a0);
//		flag=1;
//	} 
//并集
 	if(!h1[a0]) h1[a0]++;
}
//并集:整个儿遍历10000?

for(int i=0;i<20000;i++)
if (h1[i])
{if(flag) printf(" %d",i);
		else printf("%d",i);
		flag=1;
		}		
 



	
	
}

差 

 思路:遍历第一个造出哈希表,遍历第二个,每找一个,哈希表对应值-1;最后遍历第一个集合,每输出一次,哈希值-1,直至为0

#include<stdio.h>
#include<cstring>
using namespace std;
int main()
{
int n1,n2;
scanf("%d %d",&n1,&n2);
int A[n1],B[n2],h1[20000]={0},h2[20000]={0};
int a0=0;
for(int i=0;i<n1;i++)
{
	scanf("%d",&a0);
	A[i]=a0;
	h1[A[i]]++;	 
}
bool flag=0;
for(int i=0;i<n2;i++)
{
	scanf("%d",&a0);
	B[i]=a0;
//求差集 
		if(h1[a0]) h1[a0]--;
}
for(int i=0;i<n1;i++)	
{
	while(h1[A[i]])
	{
		if(flag) printf(" %d",A[i]);
		else printf("%d",A[i]);
				flag=1;
				h1[A[i]]--;
				

	}
	} 
}
	
	//求交集:
//	if(h1[a0]) 
//	{
//		if(flag) printf(" %d",a0);
//		else printf("%d",a0);
//		flag=1;
//	} 
//并集
// 	if(!h1[a0]) h1[a0]++;
//}
//并集:整个儿遍历10000?
//for(int i=0;i<20000;i++)
//if (h1[i])
//{if(flag) printf(" %d",i);
//		else printf("%d",i);
//		flag=1;
//		}		




	
	

 字符串的出现次数

我:

#include<stdio.h>
#include<cstring>
using namespace std;
int abc(char str[4])
{
	return (str[0]-'A')*26*26+(str[1]-'A')*26+(str[2]-'A');
}

int main()
{

int n1,n2;

scanf("%d",&n1);
char s1[n1+1][5];
int si1[20000]={0};
for(int i=0;i<n1;i++)
{
	scanf("%s",s1[i]);
//	printf("%d",abc(s1[i]));
	si1[abc(s1[i])]++;
//	printf("%s&%d",s1[i],si1[abc(s1[i])]);
	
}
scanf("%d",&n2);
char s2[n2+1][5];
for(int i=0;i<n2;i++)
{
	scanf("%s",s2[i]);
	if (si1[abc(s2[i])]) printf("%d",si1[abc(s2[i])]);
	else printf("0");
	if (i<n2-1) printf(" ");

}

//COD
//ABA



}


	
	

 答案

#include <cstdio>

const int MAXN = 26 * 26 * 26;
const int MAXL = 1001;
char str[MAXL];
int hashTable[MAXN] = {0};

int getHashKey(char s[]) {
    return (s[0] - 'A') * 26 * 26 + (s[1] - 'A') * 26 + (s[2] - 'A');
}

int main () {
    int n, m;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%s", str);
        hashTable[getHashKey(str)]++;
    }
    scanf("%d", &m);
    for (int i = 0; i < m; i++) {
        scanf("%s", str);
        printf("%d", hashTable[getHashKey(str)]);
        printf(i < m - 1 ? " " : "\n");
    }
    return 0;}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】信号>信号产生信号处理信号保存信号详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.信号入门 1.1 生活角度的信号 1.2 技术应用角度的信号 1.3 信号概念 1.4 信号处理常见方式概览 2.产生信号 2.1 通过终端按键…

mac远程桌面连接工具:Microsoft Remote Desktop正式版

Microsoft Remote Desktop 是一款由微软开发的远程桌面控制软件。它允许用户通过互联网连接到远程计算机&#xff0c;从而可以在本地计算机上访问和控制远程计算机的桌面、文件和应用程序。 下载地址&#xff1a;https://www.macz.com/mac/1004.html?idOTI2NjQ5Jl8mMjcuMTg2Lj…

为了性能,放弃tft_eSPI,选择arduino_gfx吧

本来对于tft_espi和arduino_gfx没啥特别的感觉&#xff0c;都是tft屏幕驱动,arduino_gfx的好处就是除了支持tft外还支持一些oled屏幕。 谁知道在探寻我那个在单片机项目上显示中文方案 https://github.com/StarCompute/tftziku 时候&#xff0c;寻求极致性能测了一些东西。 t…

Kiwi浏览器 - 支持 Chrome 扩展的安卓浏览器

​【应用名称】&#xff1a;Kiwi浏览器 - 支持 Chrome 扩展的安卓浏览器 ​【适用平台】&#xff1a;#Android ​【软件标签】&#xff1a;#Kiwi ​【应用版本】&#xff1a;124.0.6327.2 ​【应用大小】&#xff1a;233MB ​【软件说明】&#xff1a;一款基于开源项目 Chr…

每日一题 求和

1.题目解析 求和_牛客题霸_牛客网 (nowcoder.com) 这一题&#xff0c;主要描述的就是求满足和为m的子序列&#xff0c;对与子序列的问题可以使用决策树。 2.思路分析 决策树如下图所示: 递归结束条件&#xff1a; 当当前和 sum 等于目标和 m 时&#xff0c;说明找到了一个满…

软考-下午题-试题二、三

主要是最后一问的不同解答 1、父图子图平衡 1、员工关系是否存在传递依赖&#xff1f;用100字以内的文字说明理由。2019 2、在职员关系模式中&#xff0c;假设每个职员有多名家属成员&#xff0c;那么职员关系模式存在什么问题&#xff1f; 应如何解决&#xff1f;2020 职员关系…

《计算机网络微课堂》1-4 计算机网络的定义和分类

本节课我们介绍计算机网络的定义和分类。 首先来看计算机网络的定义&#xff1a;计算机网络的精确定义并未统一&#xff0c;换句话说&#xff0c;全世界没有一个对计算机网络的公认的唯一定义。 这里我们给出一个计算机网络的最简单定义&#xff0c;即计算机网络是一些互相连接…

技术前沿 |【BLIP:统一理解和生成的自举多模态模型研究】

BLIP&#xff1a;统一理解和生成的自举多模态模型研究 摘要引言一、BLIP模型概述二、 BLIP模型在多模态任务中的应用三、总结 摘要 本文介绍了BLIP&#xff08;Bootstrapping Language-Image Pre-training&#xff09;模型&#xff0c;一个前沿的多模态模型&#xff0c;通过自…

Could not create connection to database server的错误原因

1、使用MyBatis 连接数据库报错 org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. ### The error may …

软件工程基础知识

一、软件工程概述 二、软件开发模型 三、软件开发方法 四、需求分析 五、系统设计 六、系统测试 七、软件开发项目管理 八、软件质量 九、软件度量

C#使用开源操作库MiniExcel操作Excel

简介 MiniExcel 简单、高效避免 OOM 的.NET 处理 Excel 查、写、填充数据工具。 目前主流框架大多需要将数据全载入到内存方便操作&#xff0c;但这会导致内存消耗问题&#xff0c;MiniExcel 尝试以 Stream 角度写底层算法逻辑&#xff0c;能让原本 1000 多 MB 占用降低到几 …

Git常用命令的使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Introduction of Internet 计算机网络概述

计算机网络的概念 计算机网络的定义&#xff1a; 多台独立的计算机通过通信线路实现资源共享的计算机系统 计算机网络的组成 资源子网&#xff1a;提供共享的软件资源和硬件资源 通信子网&#xff1a;提供信息交换的网络结点和通信线路 计算机网络类型 按照拓扑排序 星型…

Android 配置本地解决下载 Gradle 慢的问题

步骤1 打开项目下 gradle/wrapper/gradle-wrapper.properties 文件。 步骤2 文件内容如下。 #Sat May 25 16:24:00 CST 2024 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists distributionUrlhttps\://services.gradle.org/distributions/gradle-8.7-bin…

API攻击呈指数级增长,如何保障API安全?

从远程医疗、共享汽车到在线银行&#xff0c;实时API是构建数字业务的基础。然而&#xff0c;目前超过90%的基于Web的网络攻击都以API端点为目标&#xff0c;试图利用更新且较少为人所知的漏洞&#xff0c;而这些漏洞通常是由安全团队未主动监控的API所暴露&#xff0c;致使API…

无人机测绘遥感技术及应用详解

一、技术原理与特点 无人机测绘遥感技术是基于无人机平台搭载各类遥感传感器&#xff0c;通过遥控或自主飞行的方式&#xff0c;快速获取地面目标信息的一种先进技术手段。该技术具有灵活高效、高分辨率、实时性强等特点&#xff0c;广泛应用于国土资源调查、环境监测、城市规…

备战秋招—模拟版图面试题来了

随着暑期的脚步逐渐临近&#xff0c;电子工程和集成电路设计领域的毕业生们&#xff0c;也将迎来了另一个求职的黄金期——秋招。我们总说机会是留给有准备的人。对于有志于投身于模拟版图设计的学子们来说&#xff0c;为了在众多求职者中脱颖而出&#xff0c;充分备战模拟版图…

solidworks画螺母学习笔记

螺母 单位mm 六边形 直径16mm&#xff0c;水平约束&#xff0c;内圆直径10mm 拉伸 选择两侧对称&#xff0c;厚度7mm 拉伸切除 画相切圆 切除深度7mm&#xff0c;反向切除 拔模角度45 镜像切除 倒角 直径1mm 异形孔向导 螺纹线 偏移打勾&#xff0c;距离为2mm…

Word/Excel/PPT使用技巧

Word篇 1、上一页是图片的&#xff0c;如何删除空白页回答&#xff1a;在闪烁处点击下&#xff0c;按住CtrlD,打开字体选项卡&#xff0c;勾选隐藏选项&#xff0c;就成功了&#xff0c;如下图 Excel篇 以上都是本人亲测有效&#xff0c;才放出来的&#xff08;持续更新中&a…