输入一个递增排序的数组和一个数字s,在数组中寻找两个数,使得这两个数的和为s
来源:互联网 发布:公路工程试验软件 编辑:程序博客网 时间:2024/05/16 00:50
题目:输入一个递增排序的数组和一个数字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 <= 1) { return false; } unsigned int head = 0; unsigned int tail = length -1; 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[6]= {1,2,4,7,12,15}; const int length = sizeof(arr)/sizeof(arr[0]); int *num1 = new int; int *num2 = new int; Solution s; bool result = s.FindNumsWithSum(arr, length, 15, num1, num2); std::cout << result << std::endl; std::cout << *num1 << " "<< *num2<< std::endl; delete num1; delete num2; return 0;}
一段错误的代码,主要是参数传递上:
#include <iostream>using namespace std;class Solution {public: bool FindNumsWithSum(int (&data)[6], int length, int sum, int *num1, int *num2) { if (data == NULL || length <= 1) { return false; } unsigned int head = 0; unsigned int tail = length -1; 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[6]= {1,2,4,7,12,15}; const int length = sizeof(arr)/sizeof(arr[0]); int *num1 = new int; int *num2 = new int; Solution s; bool result = s.FindNumsWithSum(arr, length, 15, num1, num2); std::cout << result << std::endl; std::cout << *num1 << " "<< *num2<< std::endl; delete num1; delete num2; return 0;}
此段代码会返回 0,0。
原因在于:
num1 = &data[head];num2 = &data[tail];
data为分配在栈内存的局部遍历,当FindNumsWithSum函数调用结束后,就会销毁该变量,使得num1, num2依旧保存之前的地址,具体的为:
在num1 = &data[head];之前,gdb调试结果为:
(gdb) p num1$4 = (int *) 0x602010(gdb) p num2$5 = (int *) 0x602030
在num1 = &data[head];之后,gdb调试结果为:
(gdb) p num2$6 = (int *) 0x7fffffffdd40(gdb) p data[2]$7 = 4(gdb) p &data[2]$8 = (int *) 0x7fffffffdd38
退出FindNumsWithSum之后:
(gdb) p num1$11 = (int *) 0x602010(gdb) p num2$12 = (int *) 0x602030
可见,退出FindNumsWithSum后,局部变量data销毁,num1,num2保存的地址又变回了原来的0x602010 0x602030
0 0
- 输入一个递增排序的数组和一个数字s,在数组中寻找两个数,使得这两个数的和为s
- 输入一个递增排序的数组和一个数字s查找两个数,使得它们的和正好是s
- 输一个递增排序的数组和一个数字 s,在数组中查找两个数使得它们的 和正好是 s
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 输入一个递增排序的数组和一个数字sum,在数组中查找两个数,使得他们的和正好是sum
- 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字
- 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好等于输入的那个数字
- 在一个数组中找两个数,使得它们的和为一个指定的数
- 输入一个递增的数组和一个数字s,找出数组中任意两个数使他们的和正好是这个数字s,如果有任意多对数字的和为s,输出任意一堆数字即可,例如,输入数组[1,2,4,7,11,15]和数字
- 定义文件输入流,调用read(byte [] b) 方法,将001.txt的内容打印 byte大小为5
- .toString().getBytes() "\r\n".getBytes() .toString()
- android Camera 架构简介
- 关于分辨率与帧的介绍
- 增强for 加上索引 打印指定格式 ,
- 输入一个递增排序的数组和一个数字s,在数组中寻找两个数,使得这两个数的和为s
- java反射的field.get(null)
- mysql主从数据库简单实现
- GeoServer安装和发布服务
- Android进程优先级
- 随机数按指定格式 写入文件
- 作业——在线学习Android课程之第六周
- 使用DBCP,C3P0,druid,apache-jdbc配置JNDI数据源
- OC阅读笔记十七: "autorelease pool"降低内存峰值