欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何利用C語言位運算解決只出現(xiàn)一次的數(shù)字

 更新時間:2021年04月07日 12:05:50   作者:預選碼農001  
這篇文章主要給大家介紹了關于如何利用C語言位運算解決只出現(xiàn)一次的數(shù)字的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

解題所需要的C語言基礎知識

hello!從現(xiàn)在開始就進入本題解的正式內容了。首先給大家用圖解的方式介紹3個C語言位運算的基本操作符 & | ^

這些知識對下面的解題都非常重要,一定要熟練掌握,不然等會會有一種“我在哪,我是誰我在干什么”的感覺。

只出現(xiàn)一次的數(shù)字I

題目描述

只出現(xiàn)一次的數(shù)字
給定一個非空整數(shù)數(shù)組,除了某個元素只出現(xiàn)一次以外,其余每個元素均出現(xiàn)兩次。找出那個只出現(xiàn)了一次的元素。

說明:

你的算法應該具有線性時間復雜度。 你可以不使用額外空間來實現(xiàn)嗎?

示例 1:

輸入: [2,2,1] 輸出: 1
示例 2:

輸入: [4,1,2,1,2] 輸出: 4

力扣本題鏈接

解題思路

首先,根據(jù)題意,“有不可以額外使用空間這個限定”,看到這里以后要本能的往位運算上面去靠,因為位運算可以不開辟額外空間解決很多問題,然后回看一下剛剛回顧的位運算知識,就知道我們要用到 ^這個操作符了,因為它可以非常簡單的消除重復項,剩下只出現(xiàn)一次的數(shù)字。

說了這么多,接下來讓我們來看看代碼的實現(xiàn)

int singleNumber(int* nums, int numsSize){
int ret=0;//0異或任何數(shù)都不會印象他的實際值
for(int i=0;i<numsSize;i++)
{
 ret^=nums[i];//所有數(shù)異或,重復的消掉,剩下只出現(xiàn)一次的數(shù)字
}
return ret;//返回這個數(shù)字
}

這只是一個開胃菜,下面正式進入主菜

只出現(xiàn)一次的數(shù)字II

題目描述

只出現(xiàn)一次的數(shù)字 II 給定一個非空整數(shù)數(shù)組,除了某個元素只出現(xiàn)一次以外,其余每個元素均出現(xiàn)了三次。找出那個只出現(xiàn)了一次的元素。

說明:

你的算法應該具有線性時間復雜度。 你可以不使用額外空間來實現(xiàn)嗎?

示例 1:

輸入: [2,2,3,2] 輸出: 3
``示例 2:

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

力扣本題鏈接

解題思路

如圖所示,考慮數(shù)字的二進制位形式,出現(xiàn)三次的數(shù)字,二進制位各位上的1都是三的倍數(shù),所以求出各位上的1數(shù)目,再對3求余,則可求出只出現(xiàn)一次的數(shù)字

那么要怎樣求取二進制位各位上1的數(shù)目吶,那就要用到&這個操作符了,來看代碼實現(xiàn)吧

int singleNumber(int* nums, int numsSize){
 
 int ret=0;
for(int i=0;i<32;++i)//循環(huán)遍歷二進制位每一位
{
long cnt=0;//不用long,力扣的編譯器不通過,不讓int類型左移31位,我也不知道
 for(int j=0;j<numsSize;++j) {//將nums數(shù)組中每一個數(shù)拿出來,二進制位向右移動i位,與1按位與,
 cnt+=(nums[j]>>i)&1;//則可求出二進制位第i位是否為1;
 }
 ret+=(cnt%3)<<i;//將cnt的值模3,求出只出現(xiàn)一次的那個數(shù)第i位為1還是為0,再向左移動i位還原,最后相加求出這個數(shù)
}
return ret;
}

好了,這個題目就圓滿解決了。

只出現(xiàn)一次的數(shù)字III

這個題目就很有技巧了 題目描述
260. 只出現(xiàn)一次的數(shù)字 III 給定一個整數(shù)數(shù)組 nums,其中恰好有兩個元素只出現(xiàn)一次,其余所有元素均出現(xiàn)兩次。 找出只出現(xiàn)一次的那兩個元素。你可以按 任意順序 返回答案。

進階:你的算法應該具有線性時間復雜度。你能否僅使用常數(shù)空間復雜度來實現(xiàn)?

示例 1:

輸入:nums = [1,2,1,3,2,5] 輸出:[3,5] 解釋:[5, 3] 也是有效的答案。
示例 2:

輸入:nums = [-1,0] 輸出:[-1,0]
示例 3:

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

力扣本題鏈接

解題思路

根據(jù)第一題的思路,就知道要全部按位異或,消除重復項。但是兩個只出現(xiàn)一次的數(shù)也異或在了一起,我們的難點就是怎么將這兩個數(shù)分離。接下來就用圖示法來告訴大家怎樣分離兩個數(shù)

接下來是代碼的實現(xiàn)

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* singleNumber(int* nums, int numsSize, int* returnSize){
int m = 0;
int ret = 0;
for (int i = 0; i < numsSize; i++)
{
	ret ^= nums[i];//將全部數(shù)異或
}
while (m < 32)
{
	if ((ret>>m)&1)//找出為1的第m位
		break;
	else
  ++m;
}
int x1 = 0, x2 = 0;//分組
int j=0;
while(j<numsSize)
{
	if ((nums[j]>>m)&1)
		x1 ^= nums[j];//異或出只出現(xiàn)一次的數(shù)字
	else
		x2 ^= nums[j];
  j++;
}
int* reRer = (int*)malloc(sizeof(int) * 2);
reRer[0] = x1;
reRer[1] = x2;
*returnSize=2;//根據(jù)題意返回長度
return reRer;//返回這兩個數(shù)
}

小編總結

這是我第一次寫題解,選了三個相對簡單常見的題目,不難,但是也能反應出一種做題的思想。我希望大家不是簡單的學會這3個題目,而是學會這種思想去解決更多的題目。同時大家有好的解題方案,也可以在評論區(qū)中留言哦,大家互相學習,一起進步。

到此這篇關于如何利用C語言位運算解決只出現(xiàn)一次數(shù)字的文章就介紹到這了,更多相關C語言位運算解決出現(xiàn)數(shù)字內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 利用C++實現(xiàn)最長公共子序列與最長公共子串

    利用C++實現(xiàn)最長公共子序列與最長公共子串

    這篇文章主要給大家介紹了如何利用C++實現(xiàn)最長公共子序列與最長公共子串,文章一開始就給大家簡單的介紹了什么是子序列,子串應該比較好理解就不用多介紹了,人后通過算法及示例代碼詳細介紹了C++實現(xiàn)的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • C++中template方法undefined reference to的問題解決

    C++中template方法undefined reference to的問題解決

    Undefined reference to 錯誤:這類錯誤是在連接過程中出現(xiàn)的,本文就來介紹一下C++中template方法undefined reference to的問題解決,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • C語言簡明講解單引號與雙引號的使用

    C語言簡明講解單引號與雙引號的使用

    這篇文章主要介紹了在C語言里單引號和雙引號的使用,本文通過實例代碼說明了單引號和雙引號的概念與各自的用法,以下就是詳細內容,需要的朋友可以參考下
    2022-04-04
  • C語言實現(xiàn)學生籍貫信息記錄簿

    C語言實現(xiàn)學生籍貫信息記錄簿

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)學生籍貫信息記錄簿,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • c語言 深入理解函數(shù)的遞歸

    c語言 深入理解函數(shù)的遞歸

    這一章講解的是函數(shù)的遞歸,因為遞歸函數(shù)是一個非常重要求解復雜問題的方法之一,在學習算法的過程之中我們也會遇到他,所以我想對它進行一次講解,希望能幫助其他人,也能幫助我自己來梳理一遍。下面我會通過一些題目的講解去認識遞歸函數(shù)
    2022-02-02
  • OpenCV基于稠密光流實現(xiàn)視頻跟蹤詳解

    OpenCV基于稠密光流實現(xiàn)視頻跟蹤詳解

    這篇文章主要為大家詳細介紹了OpenCV如何基于稠密光流實現(xiàn)視頻跟蹤功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2023-02-02
  • C++利用map實現(xiàn)并查集

    C++利用map實現(xiàn)并查集

    這篇文章主要為大家詳細介紹了C++利用map實現(xiàn)并查集,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++11特性小結之decltype、類內初始化、列表初始化返回值

    C++11特性小結之decltype、類內初始化、列表初始化返回值

    這篇文章主要介紹了C++11特性小結之decltype、類內初始化、列表初始化返回值,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • C++實現(xiàn)帶頭雙向循環(huán)鏈表的示例詳解

    C++實現(xiàn)帶頭雙向循環(huán)鏈表的示例詳解

    這篇文章主要介紹了如何利用C++實現(xiàn)帶頭雙向循環(huán)鏈表,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-12-12
  • C語言結構體計算內存占用問題解析

    C語言結構體計算內存占用問題解析

    這篇文章主要介紹了C語言結構體計算內存占用問題解析,本文通過案例來解析了C語言計算結構體內存的方式和方法,需要的朋友可以參考下
    2021-07-07

最新評論