日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【LeetCode笔记】剑指 Offer 56 . 数组中数字出现的次数(Java、位运算)

發布時間:2024/7/23 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】剑指 Offer 56 . 数组中数字出现的次数(Java、位运算) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 思路 & 代碼

題目描述

  • 比 leetcode 136要難點
  • 注意:空間復雜度要求O(1),否則用哈希表直接秒殺啦。
  • 昨天的筆試,還有刷的面經都有這道題。。。今天趕緊補補

思路 & 代碼

  • 相對于 leetcode 136,這邊多了個分組的考點,相當于分成兩個 leetcode 136
  • 如何分組?用整組異或結果,找到第一個 1 位作為location(也就是兩個答案的第一個不同位)
  • 以這個location作為標準,把數組分成兩個子數組(此位為1的數,此為為0的數)
  • 可證:兩個子數組,一定都滿足“數組中有一個數出現了一次,其他數都出現了兩次”
  • 證明:首先location本就是把兩答案區分開的,那么如何證明子數組中的其他數都是成對的呢?這個簡單,就是因為原數組本就是成對的,用location作為標準,也是把元素成對區分到子數組中。
class Solution {public int[] singleNumbers(int[] nums) {// 1. 取異或值int XOR = 0;for(int i : nums){XOR ^= i;}// 2. 找到第一個為 1 的位int location = 1;while((XOR & location) == 0){location <<= 1;}// 3. 在兩個子數組中找到兩個答案int ans1 = 0;int ans2 = 0;for(int i : nums){if((i & location) != 0){ans1 ^= i;}else{ans2 ^= i;}}return new int[]{ans1, ans2};} }
  • 無注釋版
class Solution {public int[] singleNumbers(int[] nums) {int xor = 0;for(int temp : nums) {xor ^= temp;}int firstOne = 1;while((xor & firstOne) == 0) {firstOne <<= 1;}int ans1 = 0, ans2 = 0;for(int temp : nums) {if((temp & firstOne) == 0) {ans1 ^= temp;}else {ans2 ^= temp;}}return new int[]{ans1, ans2};} }

總結

以上是生活随笔為你收集整理的【LeetCode笔记】剑指 Offer 56 . 数组中数字出现的次数(Java、位运算)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。