題目:輸入一個遞增排序的數組和一個數字s,在數組中尋找兩個數,使得這兩個數的和為s。
注意:已經是一個遞增排序數組,是以要牢牢得抓住這個特性。
#include <iostream>
using namespace std;
class Solution {
public:
bool FindNumsWithSum(int data[], int length, int sum, int *num1, int *num2) {
if (data == NULL || length <= ) {
return false;
}
unsigned int head = ;
unsigned int tail = length -;
while (head != tail) {
if (data[head]+data[tail] == sum) {
*num1 = data[head];
*num2 = data[tail];
return true;
}
else if (data[head]+data[tail] > sum) {
tail--;
}
else {
head++;
}
}
return false;
}
};
int main(int argc, char const *argv[]) {
int arr[]= {,,,,,};
const int length = sizeof(arr)/sizeof(arr[]);
int *num1 = new int;
int *num2 = new int;
Solution s;
bool result = s.FindNumsWithSum(arr, length, , num1, num2);
std::cout << result << std::endl;
std::cout << *num1 << " "<< *num2<< std::endl;
delete num1;
delete num2;
return ;
}
一段錯誤的代碼,主要是參數傳遞上:
#include <iostream>
using namespace std;
class Solution {
public:
bool FindNumsWithSum(int (&data)[], int length, int sum, int *num1, int *num2) {
if (data == NULL || length <= ) {
return false;
}
unsigned int head = ;
unsigned int tail = length -;
while (head != tail) {
if (data[head]+data[tail] == sum) {
num1 = &data[head];
num2 = &data[tail];
return true;
}
else if (data[head]+data[tail] > sum) {
tail--;
}
else {
head++;
}
}
return false;
}
};
int main(int argc, char const *argv[]) {
int arr[]= {,,,,,};
const int length = sizeof(arr)/sizeof(arr[]);
int *num1 = new int;
int *num2 = new int;
Solution s;
bool result = s.FindNumsWithSum(arr, length, , num1, num2);
std::cout << result << std::endl;
std::cout << *num1 << " "<< *num2<< std::endl;
delete num1;
delete num2;
return ;
}
此段代碼會傳回 0,0。
原因在于:
num1 = &data[head];
num2 = &data[tail];
data為配置設定在棧記憶體的局部周遊,當FindNumsWithSum函數調用結束後,就會銷毀該變量,使得num1, num2依舊儲存之前的位址,具體的為:
在num1 = &data[head];之前,gdb調試結果為:
(gdb) p num1
$4 = (int *)
(gdb) p num2
$5 = (int *)
在num1 = &data[head];之後,gdb調試結果為:
(gdb) p num2
$6 = (int *)
(gdb) p data[]
$7 =
(gdb) p &data[]
$8 = (int *)
退出FindNumsWithSum之後:
(gdb) p num1
$11 = (int *)
(gdb) p num2
$12 = (int *)
可見,退出FindNumsWithSum後,局部變量data銷毀,num1,num2儲存的位址又變回了原來的0x602010 0x602030