给定一个数组和目标值 取两数和等于目标值的数

给定一个数组:{ 5, 5, 2, 5, 1, 6, 3, 3,3 };

给定一个参数:8

取数组的两个数,两个数的和结果等于8。

int[] arr = {
  5, 5, 2, 5, 1, 6, 3, 3, 3
};
HashMap < Integer, Integer > maps = new HashMap < Integer, Integer > ();
for(int i = 0; i < arr.length; i++)
{
  int a = arr[i];
  if(maps.get(a) == null)
  {
    maps.put(a, 1);
  }
  else
  {
    maps.put(a, (maps.get(a) + 1));
  }
}
for(int i = 0; i < arr.length; i++)
{
  int j = arr[i];
  Integer integer = maps.get(j);
  if(integer == null)
  {
    continue;
  }
  if(integer == 0)
  {
    continue;
  }
  // 计算需要的数
  int nowc = (8 - j);
  // 取出需要的数的次数
  Integer integer2 = maps.get(nowc);
  if(integer2 == null)
  {
    continue;
  }
  if(integer2 == 0)
  {
    continue;
  }
  if(integer == 1)
  {
    maps.put(j, 0);
  }
  else
  {
    maps.put(j, (integer - 1));
  }
  if(integer2 == 1)
  {
    maps.put(nowc, 0);
    System.out.println(nowc + " " + j);
  }
  else
  {
    maps.put(nowc, (integer2 - 1));
    System.out.println(nowc + " " + j);
  }
}

结果:

int[] arr = {
                5, 5, 2, 5, 1, 6, 3, 3, 3
        };
        int num = 8;
        /**
         * 给arr做排序,代码省略没写
         */
        int[] array = {
                1, 2, 3, 3, 3, 5, 5, 5, 6
        };

        for (int i = 0, j = array.length - 1; i < j; ) {

            if (array[i] + array[j] < num) {
                i++;
                continue;
            }
            if (array[i] + array[j] == num) {
                System.out.println(array[i] + "  " + array[j]);
                i++;
                j--;
                continue;
            }
            if (array[i] + array[j] > num) {
                j--;
                continue;
            }
        }
    }
原文链接:给定一个数组和目标值 取两数和等于目标值的数