1. 程式人生 > >統計一個數字在排序陣列中出現的次數

統計一個數字在排序陣列中出現的次數

一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。
 * 1、把陣列從頭到尾做異或操作,出現兩次的數字會相互抵消,因為自己和自己異或就是0,剩下的就是出現1次的數字的異或

 * 2、把最後得到的異或值第一個為1的位的位置 

 * 3、根據這個位置為1將原陣列分成n等分

 * 4、分別對這n個數組求異或,因為兩個相同的數任何一位都是相同的,一定會被分到同一組,異或會相互抵消,最後得出來的就是出現次數為1的數字

import java.util.Scanner;

/**
 * 一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。
 * 1、把陣列從頭到尾做異或操作,出現兩次的數字會相互抵消,因為自己和自己異或就是0,剩下的就是出現1次的數字的異或
 * 2、把最後得到的異或值第一個為1的位的位置 3、根據這個位置為1將原陣列分成n等分
 * 4、分別對這n個數組求異或,因為兩個相同的數任何一位都是相同的,一定會被分到同一組,異或會相互抵消,最後得出來的就是出現次數為1的數字
 * 
 * @author pomay
 *
 */
public class FindNumsAppearOnce
{
	public static void NumsXOR(int[] array, int num1[], int num2[])
	{
		if (array == null || array.length < 2)
			return;
		int result = 0;
		for (int i = 0; i < array.length; i++)// 把陣列從頭到尾做異或操作
			result ^= array[i];

		int index = findBitsOf1(result);

		for (int i = 0; i < array.length; i++)
		{
			if (IsBits(array[i], index))
				num1[0] ^= array[i];
			else
				num2[0] ^= array[i];
		}

	}

	static int findBitsOf1(int result)// 找到result中第一個1的位的位置
	{
		int index = 0;
		while ((result & 1) == 0)
		{
			result = result >> 1;
			++index;
		}
		return index;
	}

	// 判斷陣列中某個數,的第index位是不是1
	static boolean IsBits(int num, int index)
	{
		num = num >> index;
		if ((num & 1) == 1)
			return true;
		else
			return false;
	}

	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext())
		{
			int n = sc.nextInt();
			int[] a = new int[n];
			for (int i = 0; i < a.length; i++)
				a[i] = sc.nextInt();
			// num1,num2分別為長度為1的陣列,傳出引數, 將num1[0],num2[0]設定為返
			int[] num1 = new int[1];
			int[] num2 = new int[1];
			num1[0] = num2[0] = 0;
			NumsXOR(a, num1, num2);
			System.out.print(num1[0] + " " + num2[0] + " ");
		}

	}

}



相關推薦

一個整型陣列出現次數最多的一個元素,要求具備較高的效率

using namespace std;const int N = 128;int main(){    vector<int> vec;    vec.reserve(N);    srand(time(NULL));    int i;    for(i = 0;i<N;++i)   

劍指offer之統計一個數字排序陣列出現次數

1.題目描述 統計一個數字在排序陣列中出現的次數。 2.問題分析 方法一: 因為是排序的陣列,首先在陣列中找到第一個值為k的位置begin,之後從begin找下一個不等於值k的位置end,則,次數為end - begin。 例如:1 2 2 3 3 3 5,k = 3

T35:統計一個數字排序陣列出現次數

思路很簡單 :就是利用二分法尋找第一個K出現的地方和最後一個K出現的地方 public class GetNumberOfK1 { public int GetNumberOfK(int [] array , int k) { int len=array.length;

統計一個數字排序陣列出現次數。(牛客劍指offer)

題目描述: 統計一個數字在排序陣列中出現的次數 class Solution { public:     int GetNumberOfK(vector<int> data ,int k) {     } };  Solu

統計一個數字排序陣列出現次數.

題目:統計一個數字在排序陣列中出現的次數。 思路:採用二分查詢的思想,尋找該數字第一次出現的下標和最後一次出現的下標,最後將兩個下標相減加1,便可得出出現的次數。具體的程式碼實現如下所示: public class Solution {     public int Ge

統計一個數字排序陣列出現次數

一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。  * 1、把陣列從頭到尾做異或操作,出現兩次的數字會相互抵消,因為自己和自己異或就是0,剩下的就是出現1次的數字的異或 * 2、把最後得到的異或值第一個為1的位的位置   * 3、

《牛客網劍指offer37題》統計一個數字排序陣列出現次數

題目:統計一個數字在排序陣列中出現的次數 結果:牛客網程式設計通過 思路及程式: //中心思想,用二分法找到第一個等於K的陣列元素,然後向兩邊移動,直到找到不等於k的元素     int GetNumberOfK(vector<int> data ,int k

(4)統計一個數字,在排序陣列出現次數

題目描述:統計一個數字K,在排序陣列中出現的次數; 例如:陣列data{1,2,2,3,3,3,3,4} , k = 3 則其出現次數應該為4; 思路一: 順序掃描,若data[i] = k , 計數Number ++; 時間複雜度為O(n); 思路二: 耗費時間主要還

牛客網——數字排序陣列出現次數

題目描述 統計一個數字在排序陣列中出現的次數。 package 劍指offer; /** * Created by Administrator on 2018/10/28. */ public class 數字在排序陣列中出現的次數 { public stat

劍指offer -- 數字排序陣列出現次數

題目描述 統計一個數字在排序陣列中出現的次數。 解題思路 因為題目給出的陣列是排序了的,所以我們想到了二分查詢。利用二分查詢找到一個數字在陣列中第一次出現的位置和最後出現的位置即可。 AC程式碼 public class Solution { public int

劍指offer:(38)知識遷移 :數字排序陣列出現次數

統計一個數字在排序陣列中出現的次數。 思路:排序陣列一定要想到二分法查詢       package co.com.jianzhioffer; import java.io.ObjectInputStream.GetField; public class

劍指offer系列(十三)陣列的逆序對,兩個連結串列的第一個公共結點,數字排序陣列出現次數

陣列中的逆序對 題目描述 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007 輸入描述: 題目保證輸入的陣列中沒有的相同的數字

《劍指offer》系列 數字排序陣列出現次數(Java)

連結 牛客:數字在排序陣列中出現的次數 題目描述 統計一個數字在排序陣列中出現的次數。 思路 我們需要求k出現的次數,我們可以直接遍歷求出答案,這樣的時間複雜度是O(n),有沒有更好的方法呢?我們找到一個數最快的是O(log n) 那麼我們可以先找到這個數字第一次出現

面試題38:數字排序陣列出現次數

6.3 知識遷移能力 描述: 統計一個數字在排序陣列中出現的次數。 solution1. 雜湊 直接利用雜湊表儲存; 時間複雜度是O(n); 解法並不是最優的,而且沒有利用排序陣列這個資訊; solution2. 二分查詢 利用二分查詢,先找到這個數字,然後再順序遍歷

php統計一個一維陣列,相同的值連續出現的最大次數

一維陣列: $array = [2,3,3,3,3,4,2,4,4,5,5,3,3,7,7,6,6,6,8,8,4,4,4,4,4,8,8,8,8,98,6,98,98]; 效果: Array ( [2] => 1 [3] => 4 [4] => 5 [5] =>

劍指Offer-53 數字排序陣列出現次數

題目: 統計一個數字在排序陣列中出現的次數。例如輸入排序陣列[1, 2, 3, 3, 3, 3, 4, 5]和數字3,由於3在這個陣列中出現了4次,因此輸出4。 樣例 輸入:[1, 2, 3, 3, 3, 3, 4, 5] , 3 輸出:4 解答: class Solution(

劍指offer| |數字排序陣列出現次數

題目:統計一個數字在排序陣列中出現的次數。例如輸入排序陣列{ 1,2,3,3,3,3,4,5}和數字3,。由於3在這個陣列中出現了4次,因此輸出4 方法一:時間複雜度為O(N) 思路:直接把陣列遍歷一遍即可,簡單粗暴 程式碼: int GetNumCount(i

【劍指offer】數字排序陣列出現次數

想的是先二分查詢,找到之後再找周圍是否有相同 執行時間:27ms 佔用記憶體:5752k # -*- coding:utf-8 -*- class Solution: def GetNumberOfK(self, data, k): # writ

劍指offer-數字排序陣列出現次數陣列

  題目描述 統計一個數字在排序陣列中出現的次數。 方法一:最簡單粗暴的方法就是遍歷!等於k就令count+1。這個方法是時間複雜度是O(n)。 class Solution{ public: int GetNumberOfK(vector<int> data

統計陣列出現次數超過一半的數字

題目描述 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如