中级农民
- 积分
- 243
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-1-25
- 最后登录
- 1970-1-1
|
- import java.util.*;
- public class Test {
- class Num {
- int val;
- int index;
- int flag;
- Num(int d, int i, int f) {
- this.val = d;
- this.index = i;
- this.flag = f;
- }
- }
- public void print(int[] nums) {
- if (nums == null || nums.length < 4) {
- return;
- }
- int n = nums.length;
- List<Num> lists = new ArrayList<>(2 * n);
- for (int i = 0; i < n; i++) {
- lists.add(new Num(nums[i], i, 1));
- if (nums[i] != 0)
- lists.add(new Num(-1 * nums[i], i, -1));
- }
- Collections.sort(lists, new Comparator<Num>(){
- public int compare(Num n1, Num n2) {
- if (n1.val == n2.val) {
- return n1.index - n2.index;
- }
- return n1.val - n2.val;
- }
- });
- int len = lists.size();
- for (int i = 0; i < len - 3; i++) {
- if (lists.get(i).val + lists.get(i + 1).val + lists.get(i + 2).val + lists.get(i + 3).val > 0)
- break;
- if (lists.get(i).val + lists.get(len - 1).val + lists.get(len - 2).val + lists.get(len - 3).val < 0)
- continue;
- for (int j = i + 1; j < len - 2; j++) {
- if (lists.get(i).val + lists.get(j).val + lists.get(j + 1).val + lists.get(j + 2).val > 0)
- break;
- if (lists.get(i).val + lists.get(j).val + lists.get(len - 1).val + lists.get(len - 2).val < 0)
- continue;
- int left = j + 1, right = len - 1;
- while (left < right) {
- if (lists.get(i).val + lists.get(j).val + lists.get(left).val + lists.get(right).val == 0) {
- printRes(i, j, left++, right--, lists);
- } else if (lists.get(i).val + lists.get(j).val + lists.get(left).val + lists.get(right).val < 0) {
- left++;
- } else {
- right--;
- }
- }
- }
- }
- }
- private void printRes(int i1, int i2, int i3, int i4, List<Num> lists) {
- List<Num> res = new ArrayList<>(4);
- res.add(lists.get(i1));
- res.add(lists.get(i2));
- res.add(lists.get(i3));
- res.add(lists.get(i4));
-
- Set<Integer> visited = new HashSet<>();
- int flagSum = 0;
- for (Num n : res) {
- flagSum += n.flag;
- visited.add(n.index);
- }
- if (flagSum != 0 || visited.size() != 4)
- return;
- Collections.sort(res, new Comparator<Num>(){
- public int compare(Num n1, Num n2) {
- if (n1.flag == n2.flag)
- return n1.index - n2.index;
- return n1.flag - n2.flag;
- }
- });
- if (res.get(0).index > res.get(2).index)
- return;
- System.out.println("Print index");
- System.out.println(res.get(0).index+"+"+res.get(1).index+"="+res.get(2).index+"+"+res.get(3).index);
- System.out.println("Print val");
- System.out.println(-res.get(0).val+"+"+-res.get(1).val+"="+res.get(2).val+"+"+res.get(3).val);
-
- // System.out.println(lists.get(i2).index+"+"+lists.get(i1).index+"="+lists.get(i3).index+"+"+lists.get(i4).index);
- // System.out.println(lists.get(i1).index+"+"+lists.get(i2).index+"="+lists.get(i4).index+"+"+lists.get(i3).index);
- // System.out.println(lists.get(i2).index+"+"+lists.get(i1).index+"="+lists.get(i4).index+"+"+lists.get(i3).index);
- System.out.println("");
- }
- public static void main(String args[]){
- Test test = new Test();
- int[] nums = new int[]{1,2,3,4,5,6};
- test.print(nums);
- }
- }
复制代码
java版,欢迎指正。
我觉得代码应该只适用于数字都不重复的情况 |
|