數(shù)組相關(guān)高頻算法題

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

給你一個(gè) 非空 整數(shù)數(shù)組 nums 卷仑,除了某個(gè)元素只出現(xiàn)一次以外窜锯,其余每個(gè)元素均出現(xiàn)兩次。找出那個(gè)只出現(xiàn)了一次的元素。
你必須設(shè)計(jì)并實(shí)現(xiàn)線性時(shí)間復(fù)雜度的算法來(lái)解決此問(wèn)題眉菱,且該算法只使用常量額外空間华坦。
異或,相同為0,不同為1,所以任何數(shù)和0做異或都是等于本身,本身和本身異或?yàn)?

class Solution {
    public int singleNumber(int[] nums) {
        int r = 0;
        for(int i=0;i<nums.length;i++){
            r = r^nums[i];
        }
        return r;
    }
}

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

給你一個(gè)整數(shù)數(shù)組 nums 警医,除某個(gè)元素僅出現(xiàn) 一次 外吟温,其余每個(gè)元素都恰出現(xiàn) 三次 律秃。請(qǐng)你找出并返回那個(gè)只出現(xiàn)了一次的元素柜裸。
你必須設(shè)計(jì)并實(shí)現(xiàn)線性時(shí)間復(fù)雜度的算法且不使用額外空間來(lái)解決此問(wèn)題蔬崩。
示例 1:
輸入:nums = [2,2,3,2]
輸出:3

示例 2:
輸入:nums = [0,1,0,1,0,1,99]
輸出:99
數(shù)字的二進(jìn)制形式险掀,對(duì)于出現(xiàn)三次的數(shù)字死宣,各 二進(jìn)制位 出現(xiàn)的次數(shù)都是 3的倍數(shù)。
因此橡淆,統(tǒng)計(jì)所有數(shù)字的各二進(jìn)制位中 1 的出現(xiàn)次數(shù)构韵,并對(duì) 3 求余,結(jié)果則為只出現(xiàn)一次的數(shù)字矛绘。

class Solution {
    public int singleNumber(int[] nums) {
        int r = 0;
        for(int i=0;i<32;i++){//對(duì)每一位
            int count = 0;//統(tǒng)計(jì)數(shù)組中所有數(shù)字的二進(jìn)制 在 i 位上 是 1 的個(gè)數(shù)
            for(int j=0;j<nums.length;j++){
                if(((nums[j]>>i)&1)==1){//nums[j] 二進(jìn)制 i 位 上是否是 1
                    count++;
                }
            }
            if(count%3==0){
                continue;
            }else{
                //i 位上 1 的個(gè)數(shù)不是 3 的倍數(shù)喧锦,因?yàn)橹怀霈F(xiàn)了 1 次的數(shù)貢獻(xiàn)出了 1
                r = r | (1<<i);
            }
            
        }
        return r;
    }
}

尋找重復(fù)數(shù)

給定一個(gè)包含 n + 1 個(gè)整數(shù)的數(shù)組 nums 定铜,其數(shù)字都在 [1, n] 范圍內(nèi)(包括 1 和 n),可知至少存在一個(gè)重復(fù)的整數(shù)涩惑。
假設(shè) nums 只有 一個(gè)重復(fù)的整數(shù) ,返回 這個(gè)重復(fù)的數(shù) 晋被。
你設(shè)計(jì)的解決方案必須 不修改 數(shù)組 nums 且只用常量級(jí) O(1) 的額外空間。
示例 1:
輸入:nums = [1,3,4,2,2]
輸出:2

示例 2:
輸入:nums = [3,1,3,4,2]
輸出:3



class Solution {
    public int findDuplicate(int[] nums) {
         int slow=0,fast=0;
         while(true){
             slow = nums[slow];
             fast = nums[nums[fast]];
             if(slow==fast){//相遇了翘魄,但是不是在入環(huán)口 根據(jù)定律:入環(huán)口到相遇點(diǎn)的距離(腹躁,即慢指針還需要走的路程到入環(huán)點(diǎn)->包含轉(zhuǎn)圈圈的)等于起點(diǎn)到入環(huán)口的的距離
                 fast = 0;
                 while(nums[fast]!=nums[slow]){
                     slow=nums[slow];
                     fast=nums[fast];
                 }
                 return nums[slow];
             }
         }
    }
}

存在重復(fù)元素 2

給你一個(gè)整數(shù)數(shù)組 nums 和一個(gè)整數(shù) k 弱左,判斷數(shù)組中是否存在兩個(gè) 不同的索引 i 和 j ,滿足 nums[i] == nums[j] 且 abs(i - j) <= k 九妈。如果存在翠霍,返回 true 棵癣;否則壁榕,返回 false 牡辽。

滑動(dòng)窗口 + 哈希表
整理題意:是否存在長(zhǎng)度不超過(guò)的 k+1 窗口挺尿,窗口內(nèi)有相同元素窄俏。
我們可以從前往后遍歷 nums踪区,同時(shí)使用 Set 記錄遍歷當(dāng)前滑窗內(nèi)出現(xiàn)過(guò)的元素拦盹。
假設(shè)當(dāng)前遍歷的元素為 nums[i]:下標(biāo)小于等于 k(起始滑窗長(zhǎng)度還不足 k+1):直接往滑窗加數(shù)养铸,即將當(dāng)前元素加入 Set 中;下標(biāo)大于 k:將上一滑窗的左端點(diǎn)元素 nums[i?k?1] 移除轧膘,判斷當(dāng)前滑窗的右端點(diǎn)元素 nums[i] 是否存在 Set 中钞螟,若存在,返回 True谎碍,否則將當(dāng)前元素 nums[i] 加入 Set 中筛圆。重復(fù)上述過(guò)程,若整個(gè) nums 處理完后仍未找到椿浓,返回 False。

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        int n = nums.length;
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < n; i++) {
            if (i > k) set.remove(nums[i - k - 1]);
            if (set.contains(nums[i])) return true;
            set.add(nums[i]);
        }
        return false;
    }
}

數(shù)組中最小正整數(shù)

給你一個(gè)未排序的整數(shù)數(shù)組 nums 闽晦,請(qǐng)你找出其中沒(méi)有出現(xiàn)的最小的正整數(shù)扳碍。
請(qǐng)你實(shí)現(xiàn)時(shí)間復(fù)雜度為 O(n) 并且只使用常數(shù)級(jí)別額外空間的解決方案。
示例 1:
輸入:nums = [1,2,0]
輸出:3

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

示例 3:
輸入:nums = [7,8,9,11,12]
輸出:1

對(duì)于一個(gè)長(zhǎng)度為 N 的數(shù)組仙蛉,其中沒(méi)有出現(xiàn)的最小正整數(shù)只能在 [1,N+1] 中笋敞。這是因?yàn)槿绻?[1,N] 都出現(xiàn)了,那么答案是 N+1

看圖就可以理解
class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        for(int i=0;i<n;i++){
            if(nums[i]<=0){
                nums[i]=n+1;
            }
        }
        for(int i=0;i<n;i++){
            //得到該數(shù)的絕對(duì)值
            int t = Math.abs(nums[i]);
            if(t>n){
                continue;
            }
            nums[t-1]=-1*Math.abs(nums[t-1]);
        }
        for(int i=0;i<n;i++){
            if(nums[i]>0){//表示沒(méi)有數(shù)來(lái)覆蓋這個(gè)位置
                return i+1;
            }
        }
        return n+1;
    }
}

丟失的數(shù)字

給定一個(gè)包含 [0, n] 中 n 個(gè)數(shù)的數(shù)組 nums 荠瘪,找出 [0, n] 這個(gè)范圍內(nèi)沒(méi)有出現(xiàn)在數(shù)組中的那個(gè)數(shù)夯巷。

示例 1:
輸入:nums = [3,0,1]
輸出:2
解釋:n = 3,因?yàn)橛?3 個(gè)數(shù)字哀墓,所以所有的數(shù)字都在范圍 [0,3] 內(nèi)趁餐。2 是丟失的數(shù)字,因?yàn)樗鼪](méi)有出現(xiàn)在 nums 中篮绰。

示例 2:
輸入:nums = [0,1]
輸出:2
解釋:n = 2后雷,因?yàn)橛?2 個(gè)數(shù)字,所以所有的數(shù)字都在范圍 [0,2] 內(nèi)吠各。2 是丟失的數(shù)字臀突,因?yàn)樗鼪](méi)有出現(xiàn)在 nums 中。

示例 3:
輸入:nums = [9,6,4,2,3,5,7,0,1]
輸出:8
解釋:n = 9贾漏,因?yàn)橛?9 個(gè)數(shù)字候学,所以所有的數(shù)字都在范圍 [0,9] 內(nèi)。8 是丟失的數(shù)字纵散,因?yàn)樗鼪](méi)有出現(xiàn)在 nums 中梳码。

示例 4:
輸入:nums = [0]
輸出:1
解釋:n = 1隐圾,因?yàn)橛?1 個(gè)數(shù)字,所以所有的數(shù)字都在范圍 [0,1] 內(nèi)边翁。1 是丟失的數(shù)字翎承,因?yàn)樗鼪](méi)有出現(xiàn)在 nums 中。

找缺失數(shù)符匾、找出現(xiàn)一次數(shù)都是異或的經(jīng)典應(yīng)用叨咖。
我們可以先求得 [1,n] 的異或和 ans,然后用 ans 對(duì)各個(gè) nums[i] 進(jìn)行異或啊胶。這樣最終得到的異或和表達(dá)式中甸各,只有缺失元素出現(xiàn)次數(shù)為 1 次,其余元素均出現(xiàn)兩次(x⊕x=0)焰坪,即最終答案 ans 為缺失元素趣倾。

class Solution {
    public int missingNumber(int[] nums) {
        int n = nums.length;
        int r = 0;
        for(int i=0;i<=n;i++){
            r = r^i;
        }
        for(int i=0;i<n;i++){
            r = r^nums[i];
            
        }
        return r;
    }
}

錯(cuò)誤的集合

集合 s 包含從 1 到 n 的整數(shù)。不幸的是某饰,因?yàn)閿?shù)據(jù)錯(cuò)誤儒恋,導(dǎo)致集合里面某一個(gè)數(shù)字復(fù)制了成了集合里面的另外一個(gè)數(shù)字的值,導(dǎo)致集合 丟失了一個(gè)數(shù)字 并且 有一個(gè)數(shù)字重復(fù) 黔漂。
給定一個(gè)數(shù)組 nums 代表了集合 S 發(fā)生錯(cuò)誤后的結(jié)果诫尽。
請(qǐng)你找出重復(fù)出現(xiàn)的整數(shù),再找到丟失的整數(shù)炬守,將它們以數(shù)組的形式返回牧嫉。
示例 1:
輸入:nums = [1,2,2,4]
輸出:[2,3]

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



class Solution {
    public int[] findErrorNums(int[] nums) {
        int n = nums.length;
        int xor = 0;
        for(int i=1;i<=n;i++){
            xor = xor ^ i;
        }
        for(int i=0;i<n;i++){
             xor = xor ^ nums[i];
        }
        int lowBit = xor & (xor ^ (xor-1));
        int num1 = 0;
        int num2 = 0;
        for(int i=1;i<=n;i++){
            if((i & lowBit) ==0){
                num1 = num1 ^ i;
            }else{
                num2 = num2 ^ i;      
            }
        }
        for(int i=0;i<n;i++){
            if((nums[i] & lowBit) ==0){
                num1 = num1 ^ nums[i];
            }else{
                num2 = num2 ^ nums[i];      
            }
        }
        for(int i=0;i<n;i++){
            if(nums[i]==num1){
                return new int[]{num1,num2};
            }
        }
        return new int[]{num2,num1};
    }
}



小于n的最大值-字節(jié)面試題

數(shù)組A中給定可以使用的1~9的數(shù),返回由A數(shù)組中的元素組成的小于n(n > 0)的最大數(shù)减途。 例如:A = {1, 2, 4, 9}酣藻,n = 2533,返回2499鳍置。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {

    private static int result = 0;
    public static void main(String[] args) {
        int[] nums = new int[]{1,2,4,9};
        int target = 2533;
        List<Integer> sk = new ArrayList<>();
        Arrays.sort(nums);
        getMinNMax(nums,sk,target);
        System.out.println(result);
    }
    public static void getMinNMax(int[] nums,List<Integer> sk,int target){
        int r = getSum(sk);
        if(r<target){
            result = Math.max(r,result);
        }
        if(r>=target){
            return;
        }
        for(int i=0;i< nums.length;i++){
            sk.add(nums[i]);
            getMinNMax(nums,sk,target);
            sk.remove(sk.size()-1);
        }
    }
    public static int getSum(List<Integer> sk){
        int r = 0;
        int t = 1;
        for(int i=sk.size()-1;i>=0;i--){
            r+=t*sk.get(i);
            t*=10;
        }
        return r;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辽剧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子税产,更是在濱河造成了極大的恐慌抖仅,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砖第,死亡現(xiàn)場(chǎng)離奇詭異撤卢,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)梧兼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)放吩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人羽杰,你說(shuō)我怎么就攤上這事渡紫〉酵疲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵惕澎,是天一觀的道長(zhǎng)莉测。 經(jīng)常有香客問(wèn)我,道長(zhǎng)唧喉,這世上最難降的妖魔是什么捣卤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮八孝,結(jié)果婚禮上董朝,老公的妹妹穿的比我還像新娘。我一直安慰自己干跛,他們只是感情好子姜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著楼入,像睡著了一般哥捕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘉熊,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天遥赚,我揣著相機(jī)與錄音,去河邊找鬼记舆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呼巴,可吹牛的內(nèi)容都是我干的泽腮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼衣赶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼诊赊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起府瞄,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碧磅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后遵馆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鲸郊,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年货邓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秆撮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡换况,死狀恐怖职辨,靈堂內(nèi)的尸體忽然破棺而出盗蟆,到底是詐尸還是另有隱情,我是刑警寧澤舒裤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布喳资,位于F島的核電站,受9級(jí)特大地震影響腾供,放射性物質(zhì)發(fā)生泄漏仆邓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一台腥、第九天 我趴在偏房一處隱蔽的房頂上張望宏赘。 院中可真熱鬧,春花似錦黎侈、人聲如沸察署。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贴汪。三九已至,卻和暖如春休吠,著一層夾襖步出監(jiān)牢的瞬間扳埂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工瘤礁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阳懂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓柜思,卻偏偏與公主長(zhǎng)得像岩调,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赡盘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容