先说下大概思路:用一个List<int[]>来存放每个圈子的好友,然后对集合进行循环判断..如果r数组中的数在List中存在的话就修改List中的数组,把r数组中另一个数添加进数组中,不存在则List.Add(),最后输出List.size()得出圈子数
但是感觉效率不怎么高,下面上代码
public static void main(String[] args) { int[][] mArr = new int[][] { { 1, 2 }, { 2, 3 }, { 2, 4 }, { 4, 5 }, { 6, 7 }, { 7, 8 } }; List<int[]> mList = new ArrayList<int[]>(); for (int i = 0; i < mArr.length; i++) { if (i != 0) { boolean flag = false; for (int j = 0; j < mList.size(); j++) { for (int m = 0; m < mList.get(j).length; m++) { if (mArr[i][0] == mList.get(j)[m]) { flag = true; int[] tempArr = new int[mList.get(j).length + 1]; for (int k = 0; k < mList.get(j).length + 1; k++) { if (k < mList.get(j).length) { tempArr[k] = mList.get(j)[k]; } else { tempArr[k] = mArr[i][1]; } } mList.set(j, tempArr); } } if (!flag) { for (int m = 0; m < mList.get(j).length; m++) { if (mArr[i][1] == mList.get(j)[m]) { flag = true; int[] tempArr = new int[mList.get(j).length + 1]; for (int k = 0; k < mList.get(j).length + 1; k++) { if (k < mList.get(j).length) { tempArr[k] = mList.get(j)[k]; } else { tempArr[k] = mArr[i][0]; } } mList.set(j, tempArr); } } } } if (!flag) { mList.add(mArr[i]); } } else { mList.add(mArr[i]); } } for (int i = 0; i < mList.size(); i++) { for (int j = 0; j < mList.get(i).length; j++) { System.out.println(i + "----" + mList.get(i)[j]); } } System.out.println(mList.size()); }
下面这个是整合成一个方法的,就是把数组索引的0和1单拎出来
private static int[][] mArr = new int[][] { { 1, 2 }, { 2, 3 }, { 2, 4 }, { 4, 5 }, { 6, 7 }, { 7, 8 } }; private static List<int[]> mList = new ArrayList<int[]>(); // 朋友圈 public static void main(String[] args) { for (int i = 0; i < mArr.length; i++) { if (i != 0) { boolean flag = false; for (int j = 0; j < mList.size(); j++) { flag = x(i, j, 0, 1); if (!flag) { x(i, j, 1, 0); } } if (!flag) { mList.add(mArr[i]); } } else { mList.add(mArr[i]); } } for (int i = 0; i < mList.size(); i++) { for (int j = 0; j < mList.get(i).length; j++) { System.out.println(i + "----" + mList.get(i)[j]); } } System.out.println(mList.size()); } //indexA,indexB为mArr中的1维数组的索引,即不是0就是1; public static boolean x(int i, int j, int indexA, int indexB) { for (int m = 0; m < mList.get(j).length; m++) { if (mArr[i][indexA] == mList.get(j)[m]) { int[] tempArr = new int[mList.get(j).length + 1]; for (int k = 0; k < mList.get(j).length + 1; k++) { if (k < mList.get(j).length) { tempArr[k] = mList.get(j)[k]; } else { tempArr[k] = mArr[i][indexB]; } } mList.set(j, tempArr); return true; } } return false; }运行结果
题目2:一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,找出这三个数中的任一个。比如数组元素为【1, 2, 4, 5, 6, 4, 2】,只有1,5,6这三个数字是唯一出现的。
思路:这个感觉比较简单,使用一个Hash把数组元素的值作为Key,如果这个Key里有值则把value赋给1否则给0,最后迭代Hash中value为0的就是不重复的数
public static void main(String[] args) { int[] mArr = new int[] { 1, 2, 4, 5, 6, 4, 2 }; Map<Integer, Integer> mHash = new HashMap<Integer, Integer>(); for (int i = 0; i < mArr.length; i++) { if (mHash.get(mArr[i]) == null) { mHash.put(mArr[i], 0); } else { mHash.put(mArr[i], 1); } } for (Map.Entry<Integer, Integer> m : mHash.entrySet()) { if (m.getValue() == 0) { System.out.println(m.getKey()); } } }