算法工程師第五天(● 哈希表理論基礎 ● 242.有效的字母異位詞 ● 349. 兩個數組的交集 ● 202. 快樂數● 1. 兩數之和 )

參考文獻 代碼隨想錄

一、有效的字母異位詞

給定兩個字符串?s?和?t?,編寫一個函數來判斷?t?是否是?s?的字母異位詞。

注意:若?s?和?t?中每個字符出現的次數都相同,則稱?s?和?t?互為字母異位詞。

示例?1:

輸入: s = "anagram", t = "nagaram"
輸出: true

示例 2:

輸入: s = "rat", t = "car"
輸出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • s?和?t?僅包含小寫字母

解法1:在python中使用統計某個字符,然后在判斷與另外一個列表中的字符是否相等,需要注意的是,它們的長度必須相等,如果不想等的話,那么久返回False,一下這個方法僅供參考,因為本人也沒有通過(超時)超時的原因:就是你每次都要尋找一次,有寫字母已經判斷過了,但是這個思路仍然需要進行統計字符出現的次數,而且統計字母次數的時間復雜度為O(n),所以就超時了

class Solution(object):def isAnagram(self, s, t):""":type s: str:type t: str:rtype: bool"""# 可以把它們轉化為列表的形式,然后在統計每個字母的次數是否已與另外一個字符列表相等(兩個字符列表相等的情況下,還有不相等的情況,那肯定就返回False)sList = list(s)tList = list(t)if len(sList) != len(tList):return Falsefor char in sList:if sList.count(char) != tList.count(char):return Falsereturn True

解法二:通過字典來計數,先統計提一個字符串中每個字符出現的次數,然后,在根據另外一個字符串中每個字母出現,來--,如果,對應的值都為0,說明,兩個字符串中每個字母出現的次數剛好相等,否則,要么一個字符的字母多了,或者少了。

class Solution(object):def isAnagram(self, s, t):""":type s: str:type t: str:rtype: bool"""# 定義一個列表,存放的是每個字母出現的個數,然后初始值都為0,先遍歷一個列表,左++,另外一個列表做--,如果定義的這個列表中出現了不是為0的說明,要么一個列表多了,要么少了indexList = [0] * 26for i in s:  # 先統計s這個字符串每個字母出現的次數indexList[ord(i) - ord("a")] += 1for i in t:  # 遍歷t上一個字符串中每個字母出現的次數做--,操作,如果為零,說明s,和,t的每個字符出現的次數同一樣indexList[ord(i) - ord("a")] -= 1for i in indexList:if i != 0:return Falsereturn True

二、兩個數組的交集

給定兩個數組?nums1?和?nums2?,返回?它們的?交集?。輸出結果中的每個元素一定是?唯一?的。我們可以?不考慮輸出結果的順序?。

示例 1:

輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2]

示例 2:

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出:[9,4]
解釋:[4,9] 也是可通過的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

解法1:判斷第一個數組里面的元素是否在另外一數組里面,如果存在,那么就添加到另外一臨時數組里,否則什么也不做操作。

class Solution(object):def intersection(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: List[int]"""aid = []for i in nums1:if i in nums2:aid.append(i)return list(set(aid))

解法二:使用集合,求交集即可

class Solution(object):def intersection(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: List[int]"""a = set(nums1)b = set(nums2)return list(a & b)

解法三:使用2個數組,分別存儲每個列表中的元素,如果兩個列表對應的值大于1,說明了,是交集

class Solution(object):def intersection(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: List[int]"""aid1 = [0] *  1001aid2 = [0] * 1001for i in nums1:aid1[i] += 1for j in nums2:aid2[j] += 1r = []for i in range(1001):if aid1[i] * aid2[i] > 0:r.append(i)return r 

三、快樂數

編寫一個算法來判斷一個數?n?是不是快樂數。

「快樂數」?定義為:

  • 對于一個正整數,每一次將該數替換為它每個位置上的數字的平方和。
  • 然后重復這個過程直到這個數變為 1,也可能是?無限循環?但始終變不到 1。
  • 如果這個過程?結果為?1,那么這個數就是快樂數。

如果?n?是?快樂數?就返回?true?;不是,則返回?false?。

示例 1:

輸入:n = 19
輸出:true
解釋:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

輸入:n = 2
輸出:false

提示:

  • 1 <= n <= 231 - 1

問題分析:首先要考慮的是,如何防止死循環,可以使用一個列表來存儲,如果它出現了2次說明已經死循環,就可以調出了,否則就添加到列表中,然后統計每個各位上平方之和,在判斷是否為1,如果不是那么就要跟新到n的值

class Solution(object):def isHappy(self, n):""":type n: int:rtype: bool"""record = []  # 為了下面的判斷,不要陷入死循環while n not in record:record.append(n)  # 把這個數添加到列表中,防止死循環num_sum = 0  # 記錄每次數的各個位上平方之和n_str = str(n)for i in n_str:num_sum += int(i) ** 2if num_sum == 1:  # 如果各個位上平方之和 == 1說明已經找到了return Trueelse:  # 否則跟新nn = num_sumreturn False

四、兩數之和

????????給定一個整數數組?nums?和一個整數目標值?target,請你在該數組中找出?和為目標值?target? 的那?兩個?整數,并返回它們的數組下標。你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。

你可以按任意順序返回答案。

示例 1:

輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

輸入:nums = [3,2,4], target = 6
輸出:[1,2]

示例 3:

輸入:nums = [3,3], target = 6
輸出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只會存在一個有效答案

問題分析:我們可以把當前遍歷的數添加到一個數組或者是字典里,然后在循環里,先判斷目標數-當前循環的元素是否在之前的數組或者是字典里,如果在那么返回對應的下標,如果不在,則返回空數組

數組版本:

????????在Python中,對于頻繁的數據訪問操作,數組(通常指列表,即list類型)和字典(dict類型)的效率差別不大。數組的訪問時間復雜度是O(1),而字典的平均時間復雜度是O(1),看起來似乎都是常數級別的時間復雜度。

但在特定情況下,數組和字典的表現可能會有明顯差異:

  1. 數組(列表):適合當你需要通過索引來快速訪問元素,或者在列表末尾頻繁添加或刪除元素。

  2. 字典:適合當你需要通過鍵來快速訪問元素,并且不關心元素的順序或者它們的添加/刪除頻率。

如果你需要頻繁地通過鍵來訪問元素,并且不需要關心元素的順序,使用字典會更高效。

如果你需要保持元素的插入順序,并且需要通過索引來頻繁訪問元素,或者你需要在列表的任意位置頻繁插入和刪除元素,使用數組(列表)會更高效。

在實際應用中,除非有極端的性能需求,否則通常不需要過度關注哪個更高效,而是根據需求選擇合適的數據結構

class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""# 使用的是數組li = [100000000000000] * 100000for index, value in enumerate(nums):if target - value in li:  # 就是用目標值減去當前遍歷的值,然后在判斷剩下的部分是否在之前的字典中return [li.index(target - value), index]li[index] = valuereturn []

字典版本:

class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""# 使用的是字典aid = {}for index, value in enumerate(nums):if target - value in aid:  # 就是用目標值減去當前遍歷的值,然后在判斷剩下的部分是否在之前的字典中return [aid[target - value], index]aid[value] = indexreturn []

為什么不寫aid[index] = value呢?因為當你查找剩下的數的下標的時候不知道,這時你就知道當前元素的下標而已,但你不知道剩下元素的下標是多少,也可以使用其它方法來尋找,但是這些方法不常用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43402.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43402.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43402.shtml

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

相關文章

風險評估:Tomcat的安全配置,Tomcat安全基線檢查加固

「作者簡介」&#xff1a;冬奧會網絡安全中國代表隊&#xff0c;CSDN Top100&#xff0c;就職奇安信多年&#xff0c;以實戰工作為基礎著作 《網絡安全自學教程》&#xff0c;適合基礎薄弱的同學系統化的學習網絡安全&#xff0c;用最短的時間掌握最核心的技術。 這一章節我們需…

grafana數據展示

目錄 一、安裝步驟 二、如何添加喜歡的界面 三、自動添加注冊客戶端主機 一、安裝步驟 啟動成功后 可以查看端口3000是否啟動 如果啟動了就在瀏覽器輸入IP地址&#xff1a;3000 賬號密碼默認是admin 然后點擊 log in 第一次會讓你修改密碼 根據自定義密碼然后就能登錄到界面…

高職物聯網實訓室

一、高職物聯網實訓室建設背景 隨著《中華人民共和國國民經濟和社會發展第十四個五年規劃和2035年遠景目標綱要》的發布&#xff0c;中國正式步入加速數字化轉型的新時代。在數字化浪潮中&#xff0c;物聯網技術作為連接物理世界與數字世界的橋梁&#xff0c;其重要性日益凸顯…

Golang | Leetcode Golang題解之第224題基本計算器

題目&#xff1a; 題解&#xff1a; func calculate(s string) (ans int) {ops : []int{1}sign : 1n : len(s)for i : 0; i < n; {switch s[i] {case :icase :sign ops[len(ops)-1]icase -:sign -ops[len(ops)-1]icase (:ops append(ops, sign)icase ):ops ops[:len(o…

Knife4j的原理及應用詳解(三)

本系列文章簡介&#xff1a; 在當今快速發展的軟件開發領域&#xff0c;API&#xff08;Application Programming Interface&#xff0c;應用程序編程接口&#xff09;作為不同軟件應用之間通信的橋梁&#xff0c;其重要性日益凸顯。隨著微服務架構的興起&#xff0c;API的數量…

價值投資者什么時候賣出股票?

經常有人說&#xff0c;會買的只是徒弟&#xff0c;會賣的才是師傅。 在閱讀《戰勝華爾街》的過程中&#xff0c;也多次感受到林奇先生的賣出邏輯&#xff0c;當股票的價格充分體現了公司的價值的時候&#xff0c;就是該賣出股票的時候。但這只是理論上的&#xff0c;從林奇先…

數據中臺指標管理系統

您所描述的是一個數據中臺指標管理系統&#xff0c;它基于Spring Cloud技術棧構建。數據中臺是企業數據管理和應用的中心平臺&#xff0c;它整合了企業內外部的數據資源&#xff0c;提供數據服務和數據管理能力。以下是您提到的各個模塊的簡要概述&#xff1a; 1. **首頁**&am…

JSP WEB開發(四) MVC模式

MVC模式介紹 MVC&#xff08;Model-View-Controller&#xff09;是一種軟件設計模式&#xff0c;最早出現在Smalltalk語言中&#xff0c;后來在Java中得到廣泛應用&#xff0c;并被Sun公司推薦為Java EE平臺的設計模式。它把應用程序分成了三個核心模塊&#xff1a;模型層、視…

2024年有多少程序員轉行了?

疫情后大環境下行&#xff0c;各行各業的就業情況都是一言難盡。互聯網行業更是極不穩定&#xff0c;頻頻爆出裁員的消息。大家都說2024年程序員的就業很難&#xff0c;都很焦慮。 在許多人眼里&#xff0c;程序員可能是一群背著電腦、進入高大上寫字樓的職業&#xff0c;他們…

SVN 80道面試題及參考答案(2萬字長文)

目錄 解釋SVN的全稱和主要功能。 SVN與CVS相比,有哪些主要改進? 描述SVN的工作流程。 什么是版本庫(repository)?它存儲了什么? 解釋工作副本(working copy)的概念。 SVN如何處理文件的版本控制? SVN中的“commit”是什么意思? 解釋“update”操作的作用。 如何…

Datawhale AI 夏令營 機器學習挑戰賽

一、賽事背景 在當今科技日新月異的時代&#xff0c;人工智能&#xff08;AI&#xff09;技術正以前所未有的深度和廣度滲透到科研領域&#xff0c;特別是在化學及藥物研發中展現出了巨大潛力。精準預測分子性質有助于高效篩選出具有優異性能的候選藥物。以PROTACs為例&#x…

Hi3861 OpenHarmony嵌入式應用入門--MQTT

MQTT 是機器對機器(M2M)/物聯網(IoT)連接協議。它被設計為一個極其輕量級的發布/訂閱消息傳輸 協議。對于需要較小代碼占用空間和/或網絡帶寬非常寶貴的遠程連接非常有用&#xff0c;是專為受限設備和低帶寬、 高延遲或不可靠的網絡而設計。這些原則也使該協議成為新興的“機器…

AutoMQ 生態集成 Kafdrop-ui

Kafdrop [1] 是一個為 Kafka 設計的簡潔、直觀且功能強大的Web UI 工具。它允許開發者和管理員輕松地查看和管理 Kafka 集群的關鍵元數據&#xff0c;包括主題、分區、消費者組以及他們的偏移量等。通過提供一個用戶友好的界面&#xff0c;Kafdrop 大大簡化了 Kafka 集群的監控…

量產工具一一UI系統(四)

目錄 前言 一、按鈕數據結構抽象 1.ui.h 二、按鍵處理 1.button.c 2.disp_manager.c 3.disp_manager.h 三、單元測試 1.ui_test.c 2.上機測試 前言 前面我們實現了顯示系統框架&#xff0c;輸入系統框架和文字系統框架&#xff0c;鏈接&#xff1a; 量產工具一一顯…

Redis 底層數據結構

? 簡單動態字符串 ? 鏈表 ? 字典 ? 跳躍表 ? 整數集合 ? 壓縮列表 ? 對象 SDS 增加了len和free屬性&#xff0c;記錄buf數組的使用空間和剩余空間。好處:strken函數直接讀取len值&#xff0c;時間復雜度是O(1)&#xff1b;預分配buf長度&#xf…

集控中心操作臺材質選擇如何選擇

作為集控中心的核心組成部分&#xff0c;操作臺不僅承載著各種設備和工具&#xff0c;更是工作人員進行監控、操作和管理的重要平臺。因此&#xff0c;選擇適合的集控中心操作臺材質顯得尤為重要。 一、材質選擇的考量因素 在選擇集控中心操作臺材質時&#xff0c;我們需要綜合…

SpringCloud跨微服務的遠程調用,如何發起網絡請求,RestTemplate

在我們的業務流程之中不一定都會是自己模塊查詢自己模塊的信息&#xff0c;有些時候就需要去結合其他模塊的信息來進行一些查詢完成相應的業務流程&#xff0c;但是在SpringCloud每個模塊都相對獨立&#xff0c;數據庫也有數據隔離。所以當我們需要其他微服務模塊的信息的時候&…

什么是SpringCloud Stream?

Spring Cloud Stream 是一個構建消息驅動微服務的框架&#xff0c;其基于Spring Boot來開發&#xff0c;并使用Spring Integration來連接消息代理中間件。該項目的目標是提供一套用于開發消息驅動應用的通用模型&#xff0c;并定義了用于發送和接收消息的綁定器&#xff08;Bin…

前端javascript中的排序算法之選擇排序

選擇排序&#xff08;Selection Sort&#xff09;基本思想&#xff1a; 是一種原址排序法&#xff1b; 將數組分為兩個區間&#xff1a;左側為已排序區間&#xff0c;右側為未排序區間。每趟從未排序區間中選擇一個值最小的元素&#xff0c;放到已排序區間的末尾&#xff0c;從…

玩轉springboot之為什么springboot可以直接執行

為什么springboot可以直接執行 先看一下springboot打包生成的MANIFEST.MF內容是什么 Manifest-Version: 1.0Implementation-Title: exam-adminImplementation-Version: 1.0-SNAPSHOTStart-Class: com.zhanghe.exam.ApplicationSpring-Boot-Classes: BOOT-INF/classes/Spring-Bo…