🤷?♂?題目一:
劍指 Offer 64. 求1+2+…+n
求
1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷陳述句(A?B:C),
此題有許多限制條件,導致許多方法難以奏效,要解決此題,首先我們得知道一個字符&&的意義:
🧐知識點補充:
&&和||的介紹:
&& 和 || 是邏輯運算子,分別是邏輯與(&&)和邏輯或(||)
1) && (邏輯與):(三種)
① 當邏輯與左邊為false,則不再進行邏輯與右邊的判斷,結果為false
② 當邏輯與左邊為true,則進行右邊判斷,右邊為false,結果為false
③ 當邏輯與左邊為true,則進行右邊判斷,右邊也為true,則結果為true
2) || (邏輯或):(三種)
① 當邏輯或左邊為false,繼續邏輯或右邊的判斷,如果也為false,結果為false
② 當邏輯或左邊為false,繼續邏輯或右邊的判斷,如果為true,結果為true
③ 當邏輯或左邊為true,則不再進行邏輯或右邊的判斷,結果為true
看似好像都明白,但這題的題解可能會重繪你的認知
👍題解代碼:
int sumNums(int n){
n && (n += sumNums(n - 1));
return n;
}
當n=0時遞回不執行,但這段代碼看似會死回圈,但我們深入剖析就能一探究竟,&&陳述句中的n與return中的n并不是同一個n,當第一句代碼執行時,程式開始遞回,n-1傳進遞回中,此時第一層遞回的n實際是n-1,而后繼續直至n=0,然后開始回傳每層遞回的n值,這就是這串代碼的含義,
🤷?♀?題目二:
劍指 Offer 57 - II. 和為s的連續正數序列
輸入一個正整數
target,輸出所有和為target的連續正整數序列(至少含有兩個數),序列內的數字由小到大排列,不同序列按照首個數字從小到大排列,

這題大體上并不難,用暴力查找即可,但一出問題的就是動態記憶體開辟,c語言中至關重要的兩個點就是指標和動態記憶體管理
🧐知識點補充:
🐰二維陣列的實質:
其實二維陣列本質上還是一維陣列,但它里面的元素是陣列,這也解釋了leetcode陣列傳參是出現二級指標的現象
🐭 malloc函式的講解:
malloc是動態記憶體分配函式,用于申請一塊連續的指定大小的記憶體塊區域以void*型別回傳分配的記憶體區域地址
函式原型:
extern void *malloc(unsigned int num_bytes);//num_bytes表示分配的長度 ?malloc如果分配成功則回傳指向被分配記憶體的指標,否則回傳空指標NULL,
重點:在使用malloc開辟空間時,使用完成一定要釋放空間,如果不釋放會造記憶體泄漏, 在使用malloc函式開辟的空間中,不要進行指標的移動,因為一旦移動之后可能出現申請的空間和釋放空間大小的不匹配
使用形式:
mallo函式回傳的實際是一個無型別指標,必須在其前面加上指標型別強制轉換才可以使用 指標自身 = (指標型別)malloc(sizeof(指標型別)資料數量)
在使用malloc開辟一段空間之后,系統會在這段空間之前做一個標記(0或1),當malloc函式開辟空間如果遇到標記為0就在此開辟,如果為1說明此空間正在被使用,
🐹 free函式講解:
malloc函式后面通常是跟著free函式,所以一起進行講解
作用:釋放malloc(或calloc、realloc)函式給指標變數分配的記憶體空間, 注意:使用后該指標變數一定要重新指向NULL,防止懸空指標(失效指標)出現,有效規避錯誤操作,
?int *p = (int *)malloc(sizeof(int)); *p = 100; free(p); p = NULL; ?free函式在釋放空間之后,把記憶體前的標志變為0,且為了防止資料泄露,它會把所釋放的空間用cd進行填充,
👍解題代碼:
int** findContinuousSequence(int target, int* returnSize, int** returnColumnSizes){
int** result = (int**)malloc(sizeof(int*) * target);
int* col = (int*)malloc(sizeof(int) * target);
int t=target/2;
int i=0;int j=0;
int c=0;int size=0;
for(i=1;i<=t;i++)
{
int i_=i;
int sum=0;int count=0;
while(1)
{
sum+=i_++;
count++;
if(sum>=target)
break;
}
if(sum==target)
{
result[c]=(int*)malloc(sizeof(int*)* count);
int k=0;
for(j=i;j<=i+count;j++)
{
result[c][k++]=j;
}
col[c]=count;
c++;
size++;
}
}
*returnColumnSizes=col;
*returnSize=size;
return result;
}
此題為暴力求解,陣列中最大的數必定小于target/2,找到相加等于target的幾個連續數后,再開辟空間然后放入資料,方法不難,但這二級指標和動態記憶體開辟會比較麻煩,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/384534.html
標籤:其他
上一篇:C語言初階函式講解

