[算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)

问题描述:

设计一个类,包含如下两个成员函数:

Save(int input) 插入一个整数到一个整数集合里。

Test(int target) 检查是否存在两个数和为输入值。如果存在着两个数,则返回true,否则返回false

允许整数集合中存在相同值的元素

分析:

[算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)不同,这里需要算出的是存不存在这两个数,可以在上一篇的基础上修改一下数据结构,HashMap其中key是数值,value是数值个数,然后需要作两步判断,map中存在数的两倍等于目标数,这时需要value=2才返回true


理一理代码思路

(1). 写Save(int input)。这个就简单了,只需判断是否存在input为key,有就value+1,没有就value=1。代码如下:

  1. public void Save(int input)
  2. {
  3. int count = 0;
  4. if (map.containsKey(input))
  5. {
  6. count = map.get(input);
  7. }
  8. map.put(input, count + 1);
  9. }

(2). 检查是否存在两个数和为输入值。上面的分析已经讲得差不多,这里就直接贴代码。代码如下:

  1. public boolean Test(int target)
  2. {
  3. Iterator<Integer> iterator = map.keySet().iterator();
  4. while (iterator.hasNext())
  5. {
  6. int one = iterator.next();
  7. int two = target - one;
  8. System.out.println("one:"+one+" two:"+two);
  9. if (map.containsKey(two))
  10. {
  11. // two<<1等价于two*2
  12. if (!(target ==two<<1 && map.get(two) == 1))
  13. {
  14. return true;
  15. }
  16. }
  17. }
  18. return false;
  19. }

整合代码最终如下

  1. import java.util.HashMap;
  2. import java.util.Iterator;
  3. public class TwoNumOfSum3
  4. {
  5. // key:数值,value:数值对应的个数
  6. HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
  7. /**
  8. * 插入一个整数到一个整数集合里
  9. * @param input
  10. */
  11. public void Save(int input)
  12. {
  13. int count = 0;
  14. if (map.containsKey(input))
  15. {
  16. count = map.get(input);
  17. }
  18. map.put(input, count + 1);
  19. }
  20. /**
  21. * 检查是否存在两个数和为输入值
  22. * @param target
  23. * @return 如果存在着两个数,则返回true,否则返回false
  24. */
  25. public boolean Test(int target)
  26. {
  27. Iterator<Integer> iterator = map.keySet().iterator();
  28. while (iterator.hasNext())
  29. {
  30. int one = iterator.next();
  31. int two = target - one;
  32. System.out.println("one:"+one+" two:"+two);
  33. if (map.containsKey(two))
  34. {
  35. if (!(target ==two<<1 && map.get(two) == 1))
  36. {
  37. return true;
  38. }
  39. }
  40. }
  41. return false;
  42. }
  43. /**
  44. * @param args
  45. */
  46. public static void main(String[] args)
  47. {
  48. TwoNumOfSum3 t=new TwoNumOfSum3();
  49. t.Save(5);
  50. t.Save(10);
  51. t.Save(4);
  52. t.Save(7);
  53. System.out.println(t.Test(12));
  54. }
  55. }

来自为知笔记(Wiz)

时间: 2024-10-12 16:33:21

[算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)的相关文章

2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小。

2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小. 我的大致思路是把这个整型数组转换成String数组,然后通过String类的compareTo方法对这个数组进行第一次排序,排序得到的结果恰好是按字典序排序,而字典序又恰好是数字从0-9的顺序,恰好符合这个要求.最后进行检验下,有的可能需要调换下顺序使得数最小. package com.cn.qunar.test; /** * @author 刘利娟 [email protected] * @

给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序

[问题] 找出反序的个数 给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序. 即:数组a[]; 对于i < j 且 a[i] > a[j],则称这是一个反序. 给定一个数组,要求写一个函数,计算出这个数组里所有反序的个数. [代码] #include <stdio.h> #include <stdlib.h> #include <string.h> int sumNum = 0; void merge(int *a,

编程题:将数字0~5放入一个整型数组,并逆序输出数组

#include<stdio.h> void main() { int i,a[5]; for(i=0;i<5;i++)         /*给数组中元素赋值*/ a[i]=i; for(i=4;i>=0;i--)          /*逆序输出数组中元素值*/ printf("%3d",a[i]); printf("\n"); } 编程题:将数字0~5放入一个整型数组,并逆序输出数组,布布扣,bubuko.com

输入一个整型数组,数组里有正数,也有负数。求所有子数组的和的最大值

题目: 输入一个整型数组,数组里有正数,也有负数. 数组中一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度为 O(n). 解答: 1 public class Solution { 2 public static void main(String[] args) { 3 int[] arr = {1,-2,3,10,-4,7,2,-5}; 4 System.out.println(maxSub(arr)); 5 } 6 7 private static int ma

定义一个整型数组,返回该数组中子数组和的最大值

对于老师上课的题目,要想获得子函数最大值,首先进行数组的遍历,在遍历起初,对最大值进行初始化为数组的第一个元素,每次遍历,求得该子数组的和,并将此和与最大值进行比较,若小于 最大值,则进行下一次的遍历,直到结束.此处用到三个for循环,来进行次数的控制.第一个 for(i = 0; i <length; i++),用来完成所有数组的循环,第二个for(j = i; j <length; j++)用来表示从第几个元素开始,寻找子数组,第三个 for( k = i; k <= j; k++)

生成一个整型数组,以便各种排序实验使用

上机环境:操作系统windows10,开发环境vs2017 生成一组10个随机数并写入文件 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> void genarray(int a[],int *b) { time_t t; int mynum; FILE *fp = fopen("E:\\myarray.txt", "

整型数组与vector对象之间的相互初始化

#include<iostream> #include<vector> #include<string> using namespace std; int main() { vector<int>::size_type i=0; int arr[10]={0,1,2,3,4,5,6,7,8,9}; //使用整型数组初始化一个vector对象 vector<int> vec(begin(arr),end(arr)); for(auto v:vec)

找出两个数组的相同元素,最优算法?

在做新旧接口交替过程中,遇到了老接口和新接口json数据有些不一致的情况,需要比较两个json对象,把相同的元素赋其中一个json对象中变量的值.而且其中一个json最后输出格式还需要改变下属性名,思来想去觉得和"找出两个数组相同元素"很像,所以做下总结. "有一个数组A{0,2,3,5}和一个数组B{3,5,6,2,1,1},找出这两个数组相同元素." 一开始抽象出这道题时,脑海里浮现出最简单粗暴的方法,逐一比较. //最简单粗暴的做法,逐个比较,时间复杂度为(B

在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行

package hanqi; import java.util.Scanner; public class Test7 { public static void main(String[] args) { //在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行 int [] x=new int[50]; int a =1; for(int i=0;i<50;i++) { x[i]=a; a+=2; } for(