LeetCode題練習與總結:只出現一次的數字Ⅱ--137

一、題目描述

給你一個整數數組?nums?,除某個元素僅出現?一次?外,其余每個元素都恰出現?三次 。請你找出并返回那個只出現了一次的元素。

你必須設計并實現線性時間復雜度的算法且使用常數級空間來解決此問題。

示例 1:

輸入:nums = [2,2,3,2]
輸出:3

示例 2:

輸入:nums = [0,1,0,1,0,1,99]
輸出:99

提示:

  • 1 <= nums.length <= 3 * 10^4
  • -2^31 <= nums[i] <= 2^31 - 1
  • nums?中,除某個元素僅出現?一次?外,其余每個元素都恰出現?三次

二、解題思路

這個問題是一個典型的位操作問題。由于每個元素都出現了三次,除了一個元素只出現了一次,我們可以考慮每個元素的每一位。如果將所有元素在每個位上累加起來,那么每個位上的和應該是3的倍數。如果有任何位上的和不是3的倍數,那么只出現一次的元素在該位上必須是1。

例如,假設數組是?[2,2,3,2](二進制表示為?[10, 10, 11, 10]):

  • 在第一位(最右邊)上,所有數的和是 1+1+1+1 = 4,不是3的倍數,這意味著只出現一次的數的第一位是1。
  • 在第二位上,所有數的和是 0+0+1+0 = 1,不是3的倍數,這意味著只出現一次的數的第二位是1。

所以,只出現一次的數是?11,即 3。

我們可以用這樣的方法檢查每個位,然后重構出只出現一次的數。

以下是具體的解題步驟:

  1. 初始化一個長度為32的數組(因為一個整數的二進制表示最多有32位)來存儲每一位的和。
  2. 遍歷數組?nums?中的每個數,對于每個數,檢查其二進制表示的每一位,如果是1,則將對應位的和加1。
  3. 遍歷完成后,檢查每一位的和,如果不是3的倍數,那么只出現一次的數在該位上是1。
  4. 根據這些信息,重構出只出現一次的數。

三、具體代碼

class Solution {public int singleNumber(int[] nums) {int[] count = new int[32]; // 32位整數for (int num : nums) {for (int i = 0; i < 32; i++) {count[i] += (num >> i) & 1; // 檢查num的第i位是否為1}}int result = 0;for (int i = 0; i < 32; i++) {// 如果count[i]不是3的倍數,那么result的第i位是1result |= (count[i] % 3) << i;}return result;}
}

四、時間復雜度和空間復雜度

1. 時間復雜度
  • 遍歷數組?nums?中的每個元素是一個 O(n) 操作,其中 n 是數組?nums?的長度。
  • 對于每個元素,我們檢查它的每一位,這是一個 O(1) 操作,因為一個整數的位數是固定的,最多為 32 位。
  • 因此,外層循環的時間復雜度是 O(n),內層循環的時間復雜度是 O(1),所以總的時間復雜度是 O(n)。
2. 空間復雜度
  • 我們使用了一個長度為 32 的數組?count?來存儲每一位的和,這是一個固定大小的數組,不隨輸入數組?nums?的大小而變化。
  • 因此,空間復雜度是 O(1),即常數空間復雜度。

綜上所述,給定代碼的時間復雜度是 O(n),空間復雜度是 O(1)。這滿足了題目要求的線性時間復雜度和常數空間復雜度。

五、總結知識點

1. 位操作

  • >>:右移操作符,用于將一個數的二進制表示向右移動指定的位數。例如,num >> i?表示將?num?的二進制表示向右移動?i?位。
  • &:按位與操作符,用于對兩個數的二進制表示進行逐位比較,只有兩個位都是1時,結果位才是1。在這里,(num >> i) & 1?用于檢查?num?的第?i?位是否為1。
  • |:按位或操作符,用于對兩個數的二進制表示進行逐位比較,只要有一個位是1,結果位就是1。在這里,result |= (count[i] % 3) << i?用于將?result?的第?i?位設置為1,如果?count[i] % 3?不為0。

2. 數組的初始化和使用

  • int[] count = new int[32];:初始化一個長度為32的整數數組,用于存儲每一位的和。

3. 循環結構

  • for (int num : nums):這是Java中的增強型for循環,用于遍歷數組?nums?中的每個元素。
  • for (int i = 0; i < 32; i++):這是一個傳統的for循環,用于重復執行32次,每次循環處理一個二進制位。

4. 取模運算

  • %:取模運算符,用于計算一個數除以另一個數后的余數。在這里,count[i] % 3?用于檢查?count[i]?是否是3的倍數。

5. 位掩碼

  • 1 << i:創建一個只在第?i?位上為1的位掩碼。這個掩碼用于將?count[i] % 3?的結果放到?result?的正確位置上。

以上就是解決這個問題的詳細步驟,希望能夠為各位提供啟發和幫助。

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

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

相關文章

K8S日常運維手冊

Kubernetes&#xff08;簡稱 K8S&#xff09;是一種廣泛使用的容器編排平臺&#xff0c;能夠自動化部署、擴展和管理容器化應用。對于運維人員來說&#xff0c;掌握 Kubernetes 的日常運維技能是確保系統穩定運行的關鍵。本文將介紹一些 Kubernetes 日常運維的基本操作與技巧&a…

虛擬機裝入kali linux

VMware 首先需要先安裝VMware Workstation Pro可以根據這篇文章來下載VMware 下載kali linux Installer Images VS Virtual Machines Installer Images&#xff08;安裝鏡像&#xff09;Virtual Machines&#xff08;虛擬機&#xff09; 直接訪問硬件&#xff0c;定制內核…

Matlab|【防騙帖】考慮時空相關性的風電功率預測誤差建模與分析

目錄 1 主要內容 2 部分程序 3 下載鏈接 1 主要內容 這個程序《考慮時空相關性的風電功率預測誤差建模與分析》畫的圖片非常漂亮&#xff0c;和原文獻基本一致&#xff0c;但是實際上內容并未實現出來&#xff0c;主要就是利用現有的風電預測的數據和結果做了相關的圖&#…

【數據結構】(C語言):鏈表

鏈表&#xff1a; 基本單位是節點。節點至少兩部分&#xff1a;數據&#xff0c;下一個數據的地址。頭指針head&#xff0c;始終指向鏈表的第一個節點。若沒有節點&#xff0c;則headNULL。鏈表在內存中是非連續的。不能使用索引&#xff08;下標&#xff09;查找元素。只能從…

解決:Xshell通過SSH協議連接Ubuntu服務器報“服務器發送了一個意外的數據包,received:3,expected:20”

下圖所示&#xff1a; 日志也基本看不出來問題在哪&#xff0c;只是說斷開了連接大概是驗證失敗。有幸在某論壇評論區找到了原因&#xff0c;是因為我的xshell版本太低了而服務器的ssh版本太高&#xff0c;高版本的ssh默認屏蔽了一部分不太安全的算法導致建立連接的時候驗證失敗…

C++ 14新特性個人總結

variable templates 變量模板。這個特性允許模板被用于定義變量&#xff0c;就像之前模板可以用于定義函數或類型一樣。變量模板為模板編程帶來了新的靈活性&#xff0c;特別是在定義泛化的常量和元編程時非常有用。 變量模板的基本語法 變量模板的聲明遵循以下基本語法&am…

解決Vue+Vite打包后Leaflet的marker圖標不顯示的問題

前言 用Leaflet寫關于WebGIS的開發&#xff0c;用Vite或者webpack打包&#xff0c;打包后會找不到圖標&#xff0c;如下所示。 直言的說&#xff0c;筆者去網上搜了搜&#xff0c;其實收到一個比較好是答案。網址如下。 &#xff08;完美解決~&#xff09;關于VueLeaflet添加…

eslint 與 prettier 的一些常見的配置項(很詳細)

目錄 1、eslint 常見配置項&#xff08;語法規范&#xff09; 2、 prettier 常見的配置項&#xff08;格式規范&#xff09; 代碼規范相關內容看小編的該文章&#xff0c;獲取對你有更好的幫助 vsCode代碼格式化&#xff08;理解eslint、vetur、prettier&#xff0c;實現格式…

IDEA啟動報錯:Abnormal build process termination...

一、問題描述 因為項目需要&#xff0c;同時打開了兩個idea&#xff0c;突然發現一個啟動的時候報錯&#xff0c;有點莫名其妙&#xff0c;剛還好好的&#xff0c;為啥就不能用了&#xff0c;一頓百度找方法&#xff0c;試了各種方法&#xff0c;像重新安裝jdk、重啟系統發現都…

TensorFlow開源項目

歡迎來到 Papicatch的博客 文章目錄 &#x1f349;TensorFlow介紹 &#x1f349;主要特點和功能 &#x1f348;多語言支持 &#x1f348;靈活的架構 &#x1f348;分布式訓練 &#x1f348;跨平臺部署 &#x1f348;強大的工具鏈 &#x1f348;豐富的社區和生態系統 &a…

c++基本數據類型和計算(一)習題講解

1.【單選題】以下說法正確的是? A. unsigned 類型的值 最大為0xFFFFFFFF B. float類型的值大約有15位精度 C.bool類型占用4個字節 解析&#xff1a; 選項A&#xff1a;unsigned 類型的值 最大為 4個字節&#xff0c;正確。選項B&#xff1a; 因為float類型的值是單精度的浮…

Vue3基礎使用

目錄 一、創建Vue3工程 (一)、cli (二)、vite 二、常用Composition API (一)、setup函數 (二)、ref函數 (三)、reactive函數 (四)、setup注意事項 (五)、計算屬性 (六)、watch (七)、watchEffect函數 (八)、生命周期 1、以配置項的形式使用生命周期鉤子 2、組合式…

kafka-簡單代碼實現生產者消費者

生產者代碼&#xff1a; package com.kafka.test;import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.seriali…

【機器學習-10】 | Scikit-Learn工具包進階指南:Scikit-Learn工具包之支持向量機模塊研究

&#x1f3a9; 歡迎來到技術探索的奇幻世界&#x1f468;?&#x1f4bb; &#x1f4dc; 個人主頁&#xff1a;一倫明悅-CSDN博客 ?&#x1f3fb; 作者簡介&#xff1a; C軟件開發、Python機器學習愛好者 &#x1f5e3;? 互動與支持&#xff1a;&#x1f4ac;評論 &…

高考填報志愿攻略,5個步驟選專業和院校

在高考完畢出成績的時候&#xff0c;很多人會陷入迷茫中&#xff0c;好像努力了這么多年&#xff0c;卻不知道怎么規劃好未來。怎么填報志愿合適&#xff1f;在填報志愿方面有幾個內容需要弄清楚&#xff0c;按部就班就能找到方向&#xff0c;一起來了解一下正確的步驟吧。 第…

入局AI手機 蘋果公布Apple Intelligence

日前&#xff0c;蘋果WWDC 2024如期召開。在這持續1個小時44分鐘的開發者大會上&#xff0c;蘋果在前一個小時里更新了iOS、iPadOS、MacOS等操作系統&#xff0c;而且還首次更新了visionOS。余下的時間全部留給了蘋果的“AI大禮包”——Apple Intelligence&#xff08;蘋果智能…

請說明Thread類中run和start的區別,從方法的區別,及運行結果的區別分別說明

方法本身的區別 start() 方法&#xff1a; run()方法是Thread類的一個普通方法&#xff0c;它包含了線程要執行的代碼。當你直接調用一個線程的run()方法&#xff08;如myThread.run()&#xff09;&#xff0c;你實際上是在當前線程&#xff08;通常是主線程&#xff09;中執行…

PointCloudLib-濾波模塊(Filtering)-使用參數化模型投影點

在本教程中,我們將學習如何將點投影到參數化模型上 (例如,平面、球體等)。參數模型通過一組 系數 – 在平面的情況下,通過其方程:ax + by + cz + d = 0。 代碼 #include <iostream> #include <pcl/point_cloud.h> // for PointCloud #include <pcl/point…

mysql是什么

mysql是什么 是DBMS軟件系統&#xff0c;并不是一個數據庫&#xff0c;管理數據庫 DBMS相當于用戶和數據庫之間的橋梁&#xff0c;有超過300種不同的dbms系統 mysql是關系型數據庫&#xff0c;關系型數據庫存儲模型很想excel&#xff0c;用行和列組織數據 sql是一門編程語言…