初次遇見雙指標的題是在一次小測試時,那時它擁有這樣的外衣……
題目:
給乙個int
型陣列無序,從陣列中選出兩數字,使得這兩數字之和為
target
,將這兩數字的下標作為陣列返回。(一定存在乙個解) 注意
:對**進行優化
,可能會超時。
given nums = [2, 7, 11, 15], target = 9,
because nums[0] + nums[1] = 2 + 7 = 9,
return [0,1].
在我第一眼看見這道題時,首先想到的是利用兩個for迴圈。當然,這個想法被扼殺在了搖籃裡,我被明確告知,那樣是會超時……
廢話不多說,切入對本題思路的剖析。
首先,本題中要求的陣列無大小,還無序。於是便牽扯到動態分配和陣列排序。(其實小弟我的動態分配學得並不好,全靠這題還小補了哈。)
但是在c語言中我們是無法直接輸入乙個int型的陣列,再返回此陣列的元素個數的。所以在每個函式呼叫時都需要加入陣列的元素個數.
//陣列排序
void rank(int *nums,int numssize)}}
}
它的存在方便了整個過程的通暢性和邏輯緊密性。
接下來就是最為關鍵的函式,實現兩元素的和為固定值,並返回下標。
在這個過程中,我出錯蠻多,也被大神洗刷了好幾次。(感謝某大神的不放棄。)
第一,這個函式中,我們呼叫了rank(
nums,
numssize
)這個函式,於是便導致了函式本來元素對應的下標產生了變化。我在這兒使用了乙個笨辦法,將其原來的下標進行記錄。
int *temp=(int*)calloc(numssize,sizeof(int)); //新開闢乙個空間,
for(i=0; i
//返回下標
int* twosum(int* nums, int numssize, int target)
else if(nums[min]+nums[max]target)
else if(nums[min]+nums[max]target)
else if(nums[min]+nums[max]#include//陣列排序
void rank(int *nums,int numssize)}}
}//輸出陣列
void print(int *nums,int numssize)
else if(nums[min]+nums[max]else
if(temp[i]==nums[max])
t2=i;
}break;}}
b[0]=t1;
b[1]=t2;
return b;
}void test()
printf("target=");
scanf("%d",&target);
p=twosum(nums,numssize,target);
for(i=0; i<2; i++)
}int main()
小弟我為程式設計的小學渣,以上言論均是自己體會,還望各位大神,不喜勿噴~
與TCP IP協議的初次見面(一)
最近lz有了一點時間,於是便拿出tcp ip的書本開始啃。開始的時候,啃起來枯燥無味,現在好不容易有點開竅,於是趕忙記錄一下,生怕自己一轉眼就給忘了。不過計算機系統原理就有點可惜了,最近一直沒時間看,選來選去,還是覺得tcp更加重要一些,或者說現階段更加重要一些。好了,廢話不多說,我們開始記錄吧。要...
與TCP IP協議的初次見面 一
今下午剛才女朋友那邊回來,唉,算是情人節去找她吧 窮屌絲住不起好酒店 住的打折酒店 只是女朋友來姨媽了 萬幸啊 牙還疼得不行 這幾天光照應她了 沒空寫部落格了 回來快補上 由於一直想看tcp ip 的知識,由於感覺網路知識方面的內容一直是我的軟肋 事實上啥都是我的軟肋 窮屌絲一枚 啥都不會 慢慢努力...
與TCP IP協議的初次見面(一)
最近lz有了一點時間,於是便拿出tcp ip的書本開始啃。開始的時候,啃起來枯燥無味,現在好不容易有點開竅,於是趕忙記錄一下,生怕自己一轉眼就給忘了。不過計算機系統原理就有點可惜了,最近一直沒時間看,選來選去,還是覺得tcp更加重要一些,或者說現階段更加重要一些。好了,廢話不多說,我們開始記錄吧。要...