1. 程式人生 > >尋找特定數字問題

尋找特定數字問題

0x00 問題描述

給定一個整數陣列,除了一個元素出現 p p 次( p > = 1 p> = 1

p k = 0 p%k!= 0 ),其餘每個元素出現 k
k
k > 1 k>1 )次,找到那個特殊的元素。

0x01 含有1bit數字的特殊情況

假設我們有一個只包含1bit數字的陣列(只能是 0

0 1 1 ),我們想計算陣列中 1 1 的數量,我們需要一個計數器count。這樣每當數字 1 1 的數量count達到某個值時,比如說 k k count返回 0 0 並重新開始。假設計數器具有二進位制形式的 m m 位: x m . . . x 1 x_m,...,x_1 (從最高有效位到最低有效位)。我們可以得出以下四個性質:

  • 計數器的初始狀態為零
  • 對於陣列中的每個輸入,如果我們碰到 0 0 ,則計數器應保持不變
  • 對於陣列中的每個輸入,如果我們碰到 1 1 ,則計數器應該增加 1 1
  • 為了覆蓋 k k 個計數,我們需要 2 m > = k 2 ^ m> = k ,這意味著 m > = l o g k m> = logk

關鍵問題就在於:計數器中的每個位( x 1 . . . x m x_1...x_m )在掃描陣列時如何變化。為了滿足第二個性質,如果另一個運算元為 0 0 的話,我們使用哪些位運算會不改變運算元呢? x = x 0 x = x | 0 x = x 0 x = x \oplus 0

好的,我們現在有兩個可用的表示式: x = x i x = x | i x = x i x = x \oplus i ,其中 i i 是輸入陣列中的元素。哪一個更好?我們還不知道,所以我們要實際操作一下。

開始時,計數器的所有位都初始化為零,即 x m = 0 . . . x 1 = 0 x_m = 0,...,x_1 = 0 ,保證計數器的所有位保持不變。如果我們碰到 0 0 ,計數器將為 0 0 ,直到我們碰到輸入陣列中的第一個 1 1 。在我們碰到第一個 1 1 之後,我們得到: x m = 0 . . . x 2 = 0 x 1 = 1 x_m = 0,...,x_2 = 0,x_1 = 1 。讓我們繼續,直到我們碰到第二個 1 1 ,之後我們得到: x m = 0 . . . x 2 = 1 x 1 = 0 x_m = 0,...,x_2 = 1,x_1 = 0 ,注意 x 1 x_1 1 1 變為 0 0 。如果使用 x 1 = x 1 i x_1 = x_1 | i 的話,在第二次計數之後, x 1 x_1 仍然是 1 1 ,所以很明顯我們應該使用 x 1 = x 1 i x_1 = x_1 \oplus i x 2 . . . x m x_2,...,x_m 呢?以 x 2 x_2 為例,如果我們此時碰到 1 1 並需要更改 x 2 x_2 的值,那麼在我們進行更改之前, x 1 x_1 的值必須是多少?答案是: x 1 x_1 必須為 1 1 ,否則我們不應該更改 x 2 x_2 ,因為將 x 1 x_1 0 0 更改為 1 1 即可。因此,只有當 x 1 x_1 i i 都是 1 1 時, x 2 x_2 才會改變值,或者用數學公式表示為 x 2 = x 2 ( x 1 i ) x_2 = x_2 \oplus (x_1&i) 。類似地,只有當 x m 1 . . . x 1 x_{m-1},...,x_1

相關推薦

尋找特定數字問題

0x00 問題描述 給定一個整數陣列,除了一個元素出現 p p p次(

尋找特定的值

print 轉換 元素 utf-8 str color items style lec 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 #查找列表中元素,移除每個元素的空格,並查找以 a或A開頭 並且以 c 結

尋找輸入數字中的全數字(pandigital) python程式設計

題目內容: 如果一個n位數剛好包含了1至n中所有數字各一次則稱它們是全數字(pandigital)的,例如四位數1324就是1至4全數字的。從鍵盤上輸入一組整數,輸出其中的全數字,若找不到則輸出“not found”。形如: def pandigital(nums): 

Python3中NumPy陣列尋找特定元素下標的兩種方法

引子 Matlab中有一個函式叫做find,可以很方便地尋找陣列內特定元素的下標,即:Find indices and values of nonzero elements。 這個函式非常有用。比如,我們想計算圖1中點Q(x0, y0)拋物線的最短距離。一個

python 尋找輸入數字中的全數字

尋找輸入數字中的全數字(pandigital)。(4分) 題目內容: 如果一個n位數剛好包含了1至n中所有數字各一次則稱它們是全數字(pandigital)的,例如四位數1324就是1至4全數字的。從鍵盤上輸入一組整數,輸出其中的全數字,若找不到則輸出“not found”。形如:

mysql,實現某個欄位從特定數字開始自增編碼

mysql資料庫使用Navicat工具新建更新SQL,實現某個欄位從特定數字開始自增編碼 set @rownum=10004243; update webdata set AR_ID=( select @rownum := @rownum +1 as nid); set @r

【A-劍指offer】04-二維陣列中的查詢特定數字 python實現

題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數

File類在指定目錄下尋找特定格式的檔案

class hello { public static void main(String[] args) throws ParseException { File dir = new File("C:\\Users\\Lee\\Pictures\\Saved Pictures"); S

如何根據自定義屬性值尋找特定的某個元素

根據自定義屬性值尋找特定的某個元素 獲取具有自定義屬性特定元素函式: tag:自定義屬性所在的元素名 attr:自定義屬性名稱 value:自定義屬性值 function getElementByAttr(tag,attr,value) {

python 隨機產生特定類型字符的函數(大寫、小寫、數字

python 學習1、創建一個 Randomcharacter.py 文件(作為模塊文件供測試或實現程序調用)內容如下:from random import randint# generate a random character between ch1 and ch2(產生ch1字符到ch2字符之間任意一

尋找數組中出現次數超過一半的數字

num std auth ted i++ mes 次數 style reat /* * 數組中出現次數超過一半的數字.cpp * * Created on: 2018年4月20日 * Author: soyo */ #include<iostr

WPF中StringFormat的用法--顯示特定位數的數字

www. ring div abc -- 寫上 format led http 原文:WPF中StringFormat的用法--顯示特定位數的數字 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csd

尋找圖片中數字的輪廓並裁剪 扣取數字

new hierarchy font 所有 tco ets 灰度圖 shape hold 本次數字圖片來自mnist庫 大體流程是:顯示原圖片——》灰度化(主要作用是改變數據的位數)——》進行腐蝕——》進行反二值化(使其變為白字黑背景)——》尋找輪廓——》畫出輪廓——》裁剪

leetcode 287. 尋找重複數【Medium】【陣列】 && 劍指Offer 面試題3 題目2:不修改陣列找出重複的數字

       這道題leetcode和劍指Offer題目略有不同。leetcode說陣列中的重複數可能不止一個,但是結果要求返回一個就行;劍指Offer上說只有一個重複的數,但是重複的次數不一定。兩個題目的共性就是隻需要返回一個重複的數即可。 leetco

python將nan, inf轉為特定數字

   在有些機器學習和神經網路模型訓練過程中,可能會遇到原始資料集經過預處理後,資料中包含Nan、Inf等佔位符,導致模型訓練損失函式計算出現偏差,最終導致模型準確率低的問題。所以需要在預處理階段,將該部分資料進行處理操作,常見操作為資料標準化處理後用0代替, 另一種方法是利用插

尋找陣列中重複的數字

引言 原題來自劍指offer第二版面試題三 題目: 在一個長度為n的數組裡的所有數字都在0~n-1範圍內。陣列中某些數字是重複的。但是不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意一個重複的數字。例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那

C#中使用DataGridView按數字大小排序顯示access中特定資料

access中表資料如下圖所示: 該表中[試樣編號]是以字元即文字格式填寫在表中。 C#中使用DataGridView顯示上述access表中指定資料,但資料需要按照[試樣編號]的數字大小排列。 如果程式碼如下ORDER BY [試樣編號],則DataGridView顯示中顯示

LeetCode刷題之一:尋找只出現一次的數字

題目為: Given an array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a

隨筆-尋找旋轉排序陣列中的最小值(無重複數字

題目: 假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。 ( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。 請找出其中最小的元素。 你可以假設陣列中不存在重複元素。 示例 1: 輸入: [3,4,5,1,2] 輸

數字之魅:尋找陣列中的最大值和最小值

陣列是最簡單的一種資料結構。我們經常碰到的一個基本問題,就是尋找整個陣列中最大的數,或者最小的數。這時,我們都會掃描一遍陣列,把最大(最小)的數找出來。如果我們需要同時找出最大和最小的數呢? 對於一個由N個整陣列成的陣列,需要比較多少次才能把最大和最小的數找出來呢? 這個題