散列(哈希)及其練習題(基礎)

目錄

散列

字符出現次數

?力扣經典題:兩數之和

?集合運算

并?

差?

?字符串的出現次數


散列

導入:

有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.pswp.cn/bicheng/15367.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15367.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15367.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖_基礎算法

圖這種數據結構還有一些比較特殊的算法&#xff0c;比如二分圖判斷&#xff0c;有環圖無環圖的判斷&#xff0c;拓撲排序&#xff0c;以及最經典的最小生成樹&#xff0c;單源最短路徑問題&#xff0c;更難的就是類似網絡流這樣的問題。 先看拓撲排序&#xff08;有環無環&…

【linux性能分析】heaptrack分析內存占用

文章目錄 1. Heaptrack是什么2. Heaptrack有哪些功能3. Heaptrack和valgrind massif對比4. Heaptrack安裝5. Heaptrack生成追蹤文件6. heaptrack_gui進行內存分析7. heaptrack_print也能用于堆分析8. 報錯解決9. 補充介紹&#xff1a;heaptrack編譯安裝 1. Heaptrack是什么 he…

內網穿透--Spp-特殊協議-上線

免責聲明:本文僅做技術交流與學習... 目錄 spp項目: 一圖通解: 1-下載spp 2-服務端執行命令 3-客戶端執行命令 4-服務端cs監聽&生馬 spp項目: GitHub - esrrhs/spp: A simple and powerful proxy 支持的協議&#xff1a;tcp、udp、udp、icmp、http、kcp、quic 支持的…

Java開發者必知的時間處理工具:SimpleDateFormat類詳解

哈嘍&#xff0c;各位小伙伴們&#xff0c;你們好呀&#xff0c;我是喵手。運營社區&#xff1a;C站/掘金/騰訊云&#xff1b;歡迎大家常來逛逛 今天我要給大家分享一些自己日常學習到的一些知識點&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相學習&#xff0c;一…

使用兩塊ESP8266實現ESP-NOW通信

ESP-NOW簡介 ESP-NOW是Espressif開發的一種基于Wi-Fi的低功耗通信協議。與傳統Wi-Fi通信不同&#xff0c;ESP-NOW不需要配對過程&#xff0c;設備間可以直接通信&#xff0c;非常適合需要快速傳輸小數據包的應用&#xff0c;如傳感器網絡、遙控器和智能家居設備。它的優勢在于…

小紅書云原生 Kafka 技術剖析:分層存儲與彈性伸縮

面對 Kafka 規模快速增長帶來的成本、效率和穩定性挑戰時&#xff0c;小紅書大數據存儲團隊采取云原生架構實踐&#xff1a;通過引入冷熱數據分層存儲、容器化技術以及自研的負載均衡服務「Balance Control」&#xff0c;成功實現了集群存儲成本的顯著降低、分鐘級的集群彈性遷…

[圖解]SysML和EA建模住宅安全系統-07 to be塊定義圖

1 00:00:01,970 --> 00:00:05,040 入侵者這里有個∞ 2 00:00:05,530 --> 00:00:07,000 說明它下面已經有子圖了 3 00:00:07,010 --> 00:00:08,080 我們看看里面子圖 4 00:00:10,200 --> 00:00:17,000 這里&#xff0c;我們看位置 5 00:00:19,030 --> 00:00:…

Vitis HLS 學習筆記--抽象并行編程模型-不良示例

目錄 1. 簡介 2. 基礎 kernel 2.1 pass kernel 2.2 double_pass kernel 2.3 add_kernel 2.4 split kernel 3. 三種bypass 3.1 input_bypass 3.2 middle_bypass 3.3 output_bypass 4. 總結 1. 簡介 本文展示三個在數據流水線中常見的問題&#xff1a; 輸入參數繞過…

python中模擬鍵盤按鍵和鼠標按鍵

目錄 0.作用和需安裝庫 1.模擬鍵盤按鍵 2.虛擬鍵表 3.模擬鼠標 0.作用和需安裝庫 作用&#xff1a;用程序實現達到按下鍵盤按鍵的作用&#xff0c;或者按下鼠標&#xff0c;無需真正按鍵盤或者鼠標。 需要安裝pywin32這個庫 pip install pywin32 1.模擬鍵盤按鍵 例子1…

在Mac OS下編寫第一個Flask代碼

在電腦上已經安裝了Homebrew&#xff0c;在Homebrew里已經安裝了Python。 創建一個新的Flask應用。這里發生了幾件事&#xff1a; 創建虛擬環境&#xff1a; 你使用python3 -m venv flask創建了一個名為flask的虛擬環境。激活虛擬環境&#xff1a; 通過運行source flask/bin/ac…

chatgpt線性差值 將直線漸變顏色

color(x)(x-x1)/(x2-x1) 與gpt給出的 這個位置比例可以表示為d/L是概念相同 x-x1是計算當前點距離起點距離&#xff0c;x2-x1是計算長度 例如&#xff0c;如果我們在直線上距離起點A的距離為d&#xff0c;整條直線的長度為L 用數學方式解釋 2024/5/25 18:54:30 當我們要在一…

vue+echart :點擊趨勢圖中的某一點或是柱狀圖,出現彈窗,并傳輸數據

樣式 在趨勢圖中點擊某一個柱狀圖&#xff0c;出現下面的彈窗 代碼實現 主要是在趨勢圖頁面代碼中&#xff0c;在初始化趨勢圖的設置中&#xff0c;添加對趨勢圖監聽的點擊方法 drawChart() {const chartData this.chartData;let option {};if (!chartData.xData?.len…

Swift 類和結構體

類和結構體 一、結構體和類對比1、類型定義的語法2、結構體和類的實例3、屬性訪問4、結構體類型的成員逐一構造器 二、結構體和枚舉是值類型三、類是引用類型1、恒等運算符2、指針 結構體和類作為一種通用而又靈活的結構&#xff0c;成為了人們構建代碼的基礎。你可以使用定義常…

python mp3轉mp4工具

成品UI 安裝moviepy庫 pip install moviepy 轉換demo from moviepy.editor import *# 創建一個顏色剪輯&#xff0c;時長與音頻相同 audioclip AudioFileClip(r"C:\Users\Administrator\PycharmProjects\pythonProject44\test4\趙照 - 燈塔守望人.mp3") videoclip…

node-nass安裝踩坑

編譯DSS的前端&#xff0c;用1.1.4編譯&#xff0c;沒有問題&#xff0c;用1.1.1版本就有問題&#xff0c;一直是node-gyp有問題&#xff0c;怎么也解決了不了。 后來檢查發現&#xff0c;是因為要安裝node-nass才導致出現node-gyp的問題。 而1.1.4沒問題&#xff0c;是因為我…

頭歌c語言實驗答案

由于頭歌C語言實驗的具體內容和題目可能隨時間變化&#xff0c;我無法直接提供特定實驗的完整答案。但我可以基于參考文章中的內容和結構&#xff0c;給出一個通用的回答格式&#xff0c;并結合相關信息進行說明。 通用回答格式 實驗名稱和描述 實驗名稱&#xff1a;頭歌C語言…

用Python Pygame做的一些好玩的小游戲

有些游戲的代碼比較長就不公布了 1.簡簡單單 1.瘋狂的雞哥 你要準備的圖片&#xff1a; 命名為&#xff1a;ji.png 代碼&#xff1a; import pygame import random as r pygame.init() pygame.display.set_caption(aaa) pm pygame.display.set_mode((800,600))class Ls(py…

Java進階學習筆記15——接口概述

認識接口&#xff1a; Java提供了一個關鍵字Interface&#xff0c;用這個關鍵字我們可以定義一個特殊的結構&#xff1a;接口。 接口不能創建對象。 注意&#xff1a;接口不能創建對象&#xff0c;接口是用來被類實現&#xff08;implements&#xff09;的&#xff0c;實現接口…

中國電子學會(CEIT)2023年05月真題C語言軟件編程等級考試三級(含詳細解析答案)

中國電子學會(CEIT)考評中心歷屆真題(含解析答案) C語言軟件編程等級考試三級 2023年05月 編程題五道 總分:100分一、找和為K的兩個元素(20分) 在一個長度為n (n < 1000)的整數序列中,判斷是否存在某兩個元素之和為k。 時間限制: 1000 內存限制: 65536 輸入 …

基于Spring Boot的高校圖書館管理系統

項目和論文都有企鵝號2583550535 基于Spring Boot的圖書館管理系統||圖書管理系統_嗶哩嗶哩_bilibili 第1章 緒論... 1 1.1 研究背景和意義... 1 1.2 國內外研究現狀... 1 第2章 相關技術概述... 2 2.1 后端開發技術... 2 2.1.1 SpringBoot 2 2.1.2 MySQL.. 2 2.1.3 My…