1. // 面试题57(一):和为s的两个数字
  2. // 题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们
  3. // 的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
  4.  
  5. #include <iostream>
  6.  
  7. bool FindNumbersWithSum(int data[], int length, int sum,
  8. int* num1, int* num2)
  9. {
  10. bool found = false;
  11. if (length < || num1 == nullptr || num2 == nullptr)//边界判断
  12. return found;
  13.  
  14. int ahead = length - ;//设置两个指针指向头和尾
  15. int behind = ;
  16.  
  17. while (ahead > behind)
  18. {
  19. long long curSum = data[ahead] + data[behind];//注意long long
  20.  
  21. if (curSum == sum)//如果刚好等于
  22. {
  23. *num1 = data[behind];
  24. *num2 = data[ahead];
  25. found = true;
  26. break;
  27. }
  28. else if (curSum > sum)//如果大于要求的数值,令尾指针向前动一个
  29. ahead--;
  30. else//如果小于要求的数值,令头指针向前动一个
  31. behind++;
  32. }
  33.  
  34. return found;
  35. }
  36.  
  37. // ====================测试代码====================
  38. void Test(const char* testName, int data[], int length, int sum, bool expectedReturn)
  39. {
  40. if (testName != nullptr)
  41. printf("%s begins: ", testName);
  42.  
  43. int num1, num2;
  44. int result = FindNumbersWithSum(data, length, sum, &num1, &num2);
  45. if (result == expectedReturn)
  46. {
  47. if (result)
  48. {
  49. if (num1 + num2 == sum)
  50. printf("Passed. \n");
  51. else
  52. printf("FAILED. \n");
  53. }
  54. else
  55. printf("Passed. \n");
  56. }
  57. else
  58. printf("FAILED. \n");
  59. }
  60.  
  61. // 存在和为s的两个数字,这两个数字位于数组的中间
  62. void Test1()
  63. {
  64. int data[] = { , , , , , };
  65. Test("Test1", data, sizeof(data) / sizeof(int), , true);
  66. }
  67.  
  68. // 存在和为s的两个数字,这两个数字位于数组的两段
  69. void Test2()
  70. {
  71. int data[] = { , , , , , };
  72. Test("Test2", data, sizeof(data) / sizeof(int), , true);
  73. }
  74.  
  75. // 不存在和为s的两个数字
  76. void Test3()
  77. {
  78. int data[] = { , , , , , };
  79. Test("Test3", data, sizeof(data) / sizeof(int), , false);
  80. }
  81.  
  82. // 鲁棒性测试
  83. void Test4()
  84. {
  85. Test("Test4", nullptr, , , false);
  86. }
  87.  
  88. int main(int argc, char* argv[])
  89. {
  90. Test1();
  91. Test2();
  92. Test3();
  93. Test4();
  94. system("pause");
  95. return ;
  96. }

《剑指offer》第五十七题(和为s的两个数字)的更多相关文章

  1. 【Java】 剑指offer(56-1) 数组中只出现一次的两个数字

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程 ...

  2. 《剑指offer》第二十七题(二叉树的镜像)

    // 面试题27:二叉树的镜像 // 题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像. #include <iostream> #include "BinaryTree ...

  3. 《剑指offer》第十七题(打印1到最大的n位数)

    // 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <ios ...

  4. 《剑指offer》面试题57. 和为s的两个数字

    问题描述 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,则输出任意一对即可. 示例 1: 输入:nums = [2,7,11,15], tar ...

  5. 剑指Offer(三十七):数字在排序数组中出现的次数

    剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...

  6. 剑指Offer(二十七):字符串的排列

    剑指Offer(二十七):字符串的排列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  7. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

  8. 剑指offer第五章

    剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...

  9. 剑指Offer(第二版)面试案例:树中两个节点的最低公共祖先节点

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/74612786冷血之心的博客) 剑指Offer(第二版)面试案例:树 ...

  10. 剑指Offer - 九度1351 - 数组中只出现一次的数字

    剑指Offer - 九度1351 - 数组中只出现一次的数字2013-11-23 01:23 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. ...

随机推荐

  1. Docker学习笔记之运行和管理容器

    0x00 概述 容器是基于容器技术所建立和运行的轻量级应用运行环境,它是 Docker 封装和管理应用程序或微服务的“集装箱”.在 Docker 中,容器算是最核心的部分了,掌握容器的操作也是 Doc ...

  2. Golang面向对象_继承

    package main import "fmt" type Person struct { name string //名字 sex byte //性别 age int //年龄 ...

  3. P1383 高级打字机

    P1383 高级打字机 主席树 一发主席树解决. 插入操作十分显然. 撤销操作复制前面的版本就行. 询问操作十分显然. #include<iostream> #include<cst ...

  4. mysql/mariadb应该使用utf8mb4而不是utf8

    详情参考https://mp.weixin.qq.com/s?__biz=MzIwMzg1ODcwMw==&mid=2247487968&idx=1&sn=2ff7b511f6 ...

  5. 20145326蔡馨熤《网络对抗》——MSF基础应用

    20145326蔡馨熤<网络对抗>——MSF基础应用 实验后回答问题 用自己的话解释什么是exploit,payload,encode. exploit:起运输的作用,将数据传输到对方主机 ...

  6. ListView与ArrayAdapter(二)

    ArrayAdapter: 数组适配器,用于简单的文字列表 activity_main.xml <RelativeLayout xmlns:android="http://schema ...

  7. Overture 5入门之如何设置延音线

    延音线作为五线谱标记符合之一,是大家使用Overture时需要常用的一个基本标记符号.延音线是一条向上或向下弯曲的弧线,它的作用是将两个或两个以上的具有相同高音的音符来进行相连. 延音线作为再编曲演唱 ...

  8. AppStore 添加回复

    itunes connect 评论位置 1, 2, 添加用户权限:除了管理和客户支持可以回复.开发人员等只有只读权限

  9. Android编译系统中的Android.bp【转】

    本文转载自: 转自:http://note.qidong.name/2017/08/android-blueprint/ Android编译系统中的Android.bp.Blueprint与Soong ...

  10. CentOS 安装 Redis 笔记

    Redis 安装 yum install redis -y 在启动 redis-server 之前,你需要修改配置文件/etc/redis.conf: 找到 bind 127.0.0.1,将其注释,这 ...