最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

解題所需要的C語言基礎(chǔ)知識(shí)

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

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

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

題目描述

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

說明:

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

示例 1:

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

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

力扣本題鏈接

解題思路

首先,根據(jù)題意,“有不可以額外使用空間這個(gè)限定”,看到這里以后要本能的往位運(yùn)算上面去靠,因?yàn)槲贿\(yùn)算可以不開辟額外空間解決很多問題,然后回看一下剛剛回顧的位運(yùn)算知識(shí),就知道我們要用到 ^這個(gè)操作符了,因?yàn)樗梢苑浅:?jiǎn)單的消除重復(fù)項(xiàng),剩下只出現(xiàn)一次的數(shù)字。

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

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

這只是一個(gè)開胃菜,下面正式進(jìn)入主菜

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

題目描述

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

說明:

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

示例 1:

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

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

力扣本題鏈接

解題思路

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

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

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

好了,這個(gè)題目就圓滿解決了。

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

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

進(jìn)階:你的算法應(yīng)該具有線性時(shí)間復(fù)雜度。你能否僅使用常數(shù)空間復(fù)雜度來實(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ù)第一題的思路,就知道要全部按位異或,消除重復(fù)項(xiàng)。但是兩個(gè)只出現(xiàn)一次的數(shù)也異或在了一起,我們的難點(diǎn)就是怎么將這兩個(gè)數(shù)分離。接下來就用圖示法來告訴大家怎樣分離兩個(gè)數(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ù)題意返回長(zhǎng)度
return reRer;//返回這兩個(gè)數(shù)
}

小編總結(jié)

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

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

相關(guān)文章

  • C語言簡(jiǎn)明分析指針與引用的具體用法

    C語言簡(jiǎn)明分析指針與引用的具體用法

    指針是一個(gè)實(shí)體,引用是一個(gè)別名;在匯編上,引用的底層是以指針的方式實(shí)現(xiàn)的,定義一個(gè)引用變量,相當(dāng)于定義了一個(gè)指針,然后把引用內(nèi)存的地址寫到這個(gè)指針里面,當(dāng)通過引用變量修改它所引用的內(nèi)存時(shí),它先訪問了指針里面的地址,然后在這個(gè)地址的內(nèi)存里面對(duì)值進(jìn)行修改
    2022-05-05
  • C語言/C++中如何產(chǎn)生隨機(jī)數(shù)

    C語言/C++中如何產(chǎn)生隨機(jī)數(shù)

    這里要用到的是rand()函數(shù), srand()函數(shù),和time()函數(shù)。需要說明的是,iostream頭文件中就有srand函數(shù)的定義,不需要再額外引入stdlib.h;而使用time()函數(shù)需要引入ctime頭文件
    2013-10-10
  • C 轉(zhuǎn)移表/轉(zhuǎn)換表的深入分析

    C 轉(zhuǎn)移表/轉(zhuǎn)換表的深入分析

    本篇文章是對(duì)c語言中轉(zhuǎn)移表/轉(zhuǎn)換表進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • c語言中數(shù)組名a和&a詳細(xì)介紹

    c語言中數(shù)組名a和&a詳細(xì)介紹

    其實(shí)這兩個(gè)東西挺難理解的,應(yīng)該也沒有那么重要,了解一下好了,主要還是要多多理解數(shù)組指針的運(yùn)算
    2013-08-08
  • C語言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版

    C語言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 學(xué)習(xí) C++能帶給我們什么

    學(xué)習(xí) C++能帶給我們什么

    這篇文章主要介紹了學(xué)習(xí) C++能帶給我們什么的相關(guān)總結(jié),主要來自于前輩們,這里匯總給大家,需要的朋友可以參考下
    2016-03-03
  • C++ 遍歷某個(gè)文件夾下所有文件的方法步驟

    C++ 遍歷某個(gè)文件夾下所有文件的方法步驟

    這篇文章主要介紹了C++ 遍歷某個(gè)文件夾下所有文件的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 深入線性時(shí)間復(fù)雜度求數(shù)組中第K大數(shù)的方法詳解

    深入線性時(shí)間復(fù)雜度求數(shù)組中第K大數(shù)的方法詳解

    本篇文章是對(duì)線性時(shí)間復(fù)雜度求數(shù)組中第K大數(shù)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++ Virtual關(guān)鍵字的具體使用

    C++ Virtual關(guān)鍵字的具體使用

    這篇文章主要介紹了C++ Virtual關(guān)鍵字的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C語言 實(shí)現(xiàn)遍歷一個(gè)文件夾的所有文件

    C語言 實(shí)現(xiàn)遍歷一個(gè)文件夾的所有文件

    這篇文章主要介紹了C語言 實(shí)現(xiàn)遍歷一個(gè)文件夾的所有文件的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評(píng)論

延庆县| 海林市| 柘荣县| 湘阴县| 梧州市| 濮阳市| 清河县| 玛曲县| 宁陵县| 蓝田县| 兴文县| 保定市| 卢湾区| 蒲江县| 明星| 阳谷县| 托里县| 寻乌县| 定州市| 寿阳县| 顺昌县| 潼关县| 吉安市| 纳雍县| 张家界市| 呼伦贝尔市| 彝良县| 出国| 洪洞县| 津南区| 江川县| 双柏县| 翁牛特旗| 阜阳市| 五原县| 搜索| 莎车县| 榕江县| 陈巴尔虎旗| 嘉鱼县| 务川|