package com.ws.arrays;import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;public class SelfFunction { /**
 * @param args
 * 1. 实现一个函数:凑14;输入很多个整数(1<=数值<=13),
 * 任意两个数相加等于14就可以从数组中删除这两个数,求剩余数(按由小到大排列);
 * 比如: 输入数组[9,1,9,7,5,13], 输出数组[7,9]
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList list = new ArrayList();
list.add(9);
list.add(1);
list.add(9);
list.add(7);
list.add(5);
list.add(13);
list.add(6);
list.add(4);
list.add(8);
// System.out.println(getArray(list));
int[] array = {9,1,9,7,5,13,6,4,8};
int[] cArray = getArray(array);
for(int i=0;i<cArray.length;i++){
System.out.print(cArray[i]+",");
}
}
public static int[] getArray(int[] array){
ArrayList conList = new ArrayList();
arrF1 : for(int i=0;i<array.length-1;i++){
arrF2 : for(int j=1;j<array.length;j++){
if(conList.contains(i)){
continue arrF1;
}else{
if(conList.contains(j) || i==j){
continue arrF2;
}
if((array[i]+array[j]) == 14){
conList.add(i);
conList.add(j);
}
}
}
}
int [] array2 = new int[array.length-conList.size()];
int count = 0;
for(int i=0;i<array.length;i++ ){
if(!conList.contains(i)){
array2[count]=array[i];
count++;
}
}
Arrays.sort(array2);
return array2;
}

public static ArrayList getArray(ArrayList<Integer> list){
BigDecimal b1;
BigDecimal b2;
ArrayList countList = new ArrayList();
ArrayList list2 = new ArrayList();
arrF1 : for(int i=0;i<list.size()-1;i++){
arrF2 : for(int j=1;j<list.size();j++){
b1 = new BigDecimal(list.get(i));
b2 = new BigDecimal(list.get(j));
if(countList.contains(i)){
continue arrF1;
}else{
if(countList.contains(j) || i==j){
continue arrF2;
}
if(b1.add(b2).intValue() == 14){
countList.add(i);
countList.add(j);
}
}
}
}
for(int i = 0;i<list.size();i++){
if(!countList.contains(i)){
list2.add(list.get(i));
}
}
return list2;
}
}

解决方案 »

  1.   

    其实我觉得这样也许比较好~~还没验证是不是一定正确。import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;public class Test {
    public static void main(String[] args) { int[] arr = { 9, 1, 9, 7, 5, 13, 6, 4, 8 };
    Arrays.sort(arr);
    int[] tmp = new int[arr.length];
    for (int i = 0; i < arr.length; i++)
    tmp[i] = 14 - arr[i];
    Arrays.sort(tmp);
    System.out.println(Arrays.toString(arr));
    System.out.println(Arrays.toString(tmp)); List<Integer> a = new ArrayList<Integer>(); for (int i = 0; i < arr.length; i++)
    if (arr[i] != tmp[i])
    a.add(arr[i]);
    for (Integer i : a)
    System.out.print(i + " ");
    System.out.println();
    }
    }
      

  2.   

    还却了一个7没有打印出来只打印出了4 9 ,不过你的思路真的很好学习了。谢谢
    还有这个题目帮我也看看怎么实现好吗!我不知道啥意思。
    各位知道下面的题目是什么意思吗?请解释下或提供下实现方法,本人主要是不知道题目是什么意思。实现一个函数:线段重叠; 输入多个一维线段,求出这些线段相交的所有区域(也用线段表示);
    一条线段用两个值表示(x0,x1), 其中x1>x0;   
    比如: 输入线段数组[(2,4),(1.5,6),(0.5,3.5),(5,7),(7.5,9)],  
    输出线段数组[(1.5,4),(5,6)]
      

  3.   

    再写了一个,效率不知道满足不import java.util.Arrays;
    import java.util.LinkedList;
    import java.util.List;public class Test {
    public static void main(String[] args) {
    int[] arr = { 9, 1, 9, 7, 7, 7, 5, 13, 6, 4, 8 };
    Arrays.sort(arr);//排序后感觉会方便一些
    List<Integer> list = new LinkedList<Integer>();
    for (int i : arr)
    list.add(i); for (int i = 0; i < list.size(); i++) {
    for (int j = i + 1; j < list.size(); j++) {
    if ((list.get(i) + list.get(j)) == 14) {
    list.remove(i);
    list.remove(j - 1);//因为上一句使得size-1了
    i = 0;
    j = 0;
    }
    }
    }
    for (int i : list)
    System.out.print(i + " ");
    System.out.println();
    }
    }
      

  4.   

    dreamhunter_lan
    思路很有意思,单这个性能方面可能相对差点。