哈尔滨编程大赛编程题目一

好久没写算法题了

昨天一个远房弟弟找到我,让我帮做个题,正好练练手吧,记在这里

题目

任务:随机给出三个整数分别存放在变量【A】、【B】、【C】中,如果将它们连成一排,将会得到一个多位整数。请你找出各种 连接方法得到的最大的多位整数,将它存放到变量【结果】中;

注意:【A】、【B】、【C】的值已经帮你存好了,你不需要再修 改它们,直接使用即可;举例:【A】为13,【B】为312,【C】为343,连接成的最大整数应该为34331213,要将它存到变量【结果】里;编程对象:禾木;特殊规则:不能删除给出的变量、列表和角色,可以新建变量、列表辅助解题。会进行多次检验,你编写的代码不能永远不停地执行,不能使用【停止全部】代码块。

分析

全排列,比大小

代码

import java.util.ArrayList;
import java.util.List;

public class IntegerCombination {

    private static List<Integer> allPossibleResults = new ArrayList<>();

    public static void main(String[] args) {

        int a = 12;
        int b = 34;
        int c = 56;
        int max = findMaxIntCombination(new int[]{a, b, c});
        System.out.println("max = " + max);
    }

    private static int findMaxIntCombination(int[] ints) {

        perm(ints);
        return findMax(allPossibleResults);
    }

    private static void perm(int[] s) {

        if (s == null || s.length == 0) {
            return;
        }
        _perm(s, 0, s.length - 1);
    }

    private static void _perm(int[] s, int start, int end) {

        if (start == end) {
            allPossibleResults.add(buildBigInt(s));
            return;
        }
        for (int i = start; i <= end; i++) {
            swap(s, start, i);
            _perm(s, start + 1, end);
            swap(s, start, i);
        }
    }

    private static Integer buildBigInt(int[] s) {

        StringBuilder result = new StringBuilder();
        for (int i : s) {
            result.append(i);
        }
        return Integer.valueOf(result.toString());
    }

    private static void swap(int[] s, int start, int i) {

        int tmp = s[start];
        s[start] = s[i];
        s[i] = tmp;
    }

    private static int findMax(List<Integer> result) {

        int max = Integer.MIN_VALUE;
        for (Integer integer : result) {
            if (integer > max) {
                max = integer;
            }
        }
        return max;
    }
}

你可能感兴趣的:(算法)