天天看點

輸入一個遞增排序的數組和一個數字s,在數組中尋找兩個數,使得這兩個數的和為s

題目:輸入一個遞增排序的數組和一個數字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