问题描述:给出一个数组{2,9,3,1,4,5,4},请问其中是否存在两个数字相加之和为9,如果存在则打印结果
解决方案:
1.暴力for循环:进行两次遍历,外层for循环选择一个数字,并在此基础上再选择内层for循环的数字,然后验证选择的两个数字是否相加为9. 该方法的时间复杂度为O(n2)
实现代码:
- import java.util.HashSet;
- /**
- * 给定一个数组,问是否存在两个数使得相加的结果为9
- * 使用方法:暴力for循环
- *
- */
- public class Method1 {
- public static void main(String[] args) {
- //定义一个数组
- int a[]={2,9,3,1,4,5,4};
- //目标
- int target=9;
- //HashSet存放结果
- HashSet<String> set=new HashSet<>();
- for(int i=0,len=a.length;i<len;i++){
- for(int k=i+1;k<len;k++){
- //string ,string2 目的是去除重复的组合
- String string=(a[i]+","+a[k]);
- String string2=(a[k]+","+a[i]);
- if(a[i]+a[k]==target&&!set.contains(string)&&!set.contains(string2)){
- set.add(string);
- }
- }
- }
- //遍历结果
- for(String s:set){
- System.out.println(s);
- }
- }
- }
2.运用一层for循环解决:我们知道,假设有x,y两个数字,求其和为9。则有y=9-x;然后查看y是否在给出的数组中,如果存在,则打印该组合。
实现代码:
- import java.util.HashSet;
- public class Method2 {
- public static void main(String[] args) {
- //定义一个数组
- int a[]={2,9,3,1,4,5,4};
- //目标
- int target=9;
- //定义hashset记录a中存在的数字
- HashSet<Integer>set=new HashSet<>();
- for (int i = 0; i < a.length; i++) {
- set.add(a[i]);
- }
- //收藏结果
- HashSet<String>set2=new HashSet<>();
- for(int i=0,len=a.length;i<len;i++){
- int x=a[i];
- //得到y的表达式
- int y=target-x;
- //查找y是否属于a数组的元素,!set2.contains(x+","+y)&&!set2.contains(y+","+x)这个判断是为了使结果唯一
- if(set.contains(y)&&!set2.contains(x+","+y)&&!set2.contains(y+","+x)){
- set2.add(x+","+y);
- }
- }
- //遍历结果
- for(String s:set2){
- System.out.println(s);
- }
- }
- }