C 語言:面試題17.04.消失的數字

完成于11.07

消失的數字

這次還是來自力扣的一個題目,寫法挺多的。依照舊曆,先貼個題目鏈接,讓大家熟悉下題目,順便挑戰下自己:點擊進入:消失的數字

題目描述

題目描述

代碼來啦
1、這是我自己的想法:

我的想法

/*我的想法就是,既然是一個遞增數組丟失了一個數字,那麼我創建一個遞增數組,但是沒有丟失數字,
只需要新的數組減去丟失數字數組得到的結果,不恰好就是我想要找回的消失的數字嗎?*/
int missingNumber(int* nums, int numsSize)
{
    int array[numsSize+1];//創建一個新的遞增數組
    int sum1=0;//讓新數組之和初始化為0
    for(int i =0;i<numsSize+1;i++)//因為消失了一位數字,因此新數組長度應該比舊數組長度+1
    {
        array[i]=i;//根據遞增規律,為新數組添加元素
        sum1=sum1+array[i];//將新數組元素之和求出
    }
    int sum2=0;//讓舊數組之和初始化為0
    for(int j=0;j<numsSize;j++)
    {
        sum2=sum2+nums[j];//將舊數組之和求出
    }
    return sum1-sum2;//返回兩者之差,就是我們要求的消失的數字
}
運行結果1️⃣:

運行結果1️⃣

2、這是一個較優解:

更優解

/*此處參考了別人的想法,然後自己總結得出的更優解
我創建一個新數組,長度為舊數組長度+,然後邊創建,邊讓新數組中元素全為0,
緊接著,因為原數組中元素從0開始遞增,因此我給新數組元素賦值1,而下標就是舊數組中的元素,
最後我只要比較新數組中哪個元素不等於1(等於0),就知道該元素對應下標就是消失的數字*/
int missingNumber(int* nums, int numsSize)
{
    int result=0;//初始化result為0
    int array[numsSize+1];//創建一個新數組,長度為舊數組長度+1
    for(int i = 0;i<numsSize+1;i++)//注意新數組長度應為舊數組長度+1
    {
        array[i]=0;//讓新數組中的每個元素都為0
    }
    for(int j =0;j<numsSize;j++)
    {
        int num=nums[j];//讓num等於舊數組中元素大小,用於下面新數組下標
        array[num]=1;//!!!最重要的一步,讓新數組中對應舊數組元素的下標的元素等於1
    }
    for(int k =0;k<numsSize+1;k++)//遍歷新數組
    {
        if(array[k]!=1)//如果新數組中某個元素不等於1(等於0),這個元素對應下標就是丟失的數字
        {
            result = k;//用result將下標傳出循環
        }
    }
    return result;//返回result結果,即為消失的數字
}
運行結果2️⃣:

運行結果2️⃣

寫在最後:
  • 其實很多題目不是語法上很難,而是邏輯很嚴密,有時候還需要我們對數學十分熟悉,遇到問題多畫圖,多舉例子嘗試,把邏輯理清楚就沒問題的!
  • 即使自己做出來了,也要去看看別人的題解,或許有更優解能讓你茅塞頓開!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值