华为机试

1. 整数拆分问题

一个整数总可以拆分为2的幂的和,例如:
7=1+2+4
7=1+2+2+2
7=1+1+1+4
7=1+1+1+2+2
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
统共有六种不合的拆分体式格式。

1. 题目解答

题目分析

对于奇数n=2k+1:它的拆分的第一项必然是1,推敲去掉这个1,其实就一一对应于 2k的拆分,是以f(2k+1)=f(2k).
对于偶数n=2k:推敲有1和没有1的拆分。有1的拆分,与(2k-1)的拆分一一对应,与上方奇数的景象来由雷同;没有1的拆分,将每项除以2,正好一一对应于k的所有拆分。是以f(2k)=f(2k-1)+f(k).

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        while(s.hasNextInt()) {
            int n = s.nextInt();
            int[] f = new int[1000001];
            f[1] = 1;
            for(int i = 2; i <= n; i++) {
                if(i % 2 == 0) {
                    f[i] = (f[i-1] + f[i/2]) % 1000000000;
                }else {
                    f[i] = f[i-1];
                }
            }
            System.out.println(f[n]);
        }
    }

2. 大数相加

大数问题

public static String bigNumberAdd(String a, String b) {
        if(a == null || b == null || a.equals("") || b.equals(""))
            return null;
        StringBuilder result = new StringBuilder();
        //反转
        StringBuilder sbA = new StringBuilder(a).reverse();
        StringBuilder sbB = new StringBuilder(b).reverse();
        int lenA = sbA.length();
        int lenB = sbB.length();
        int maxLen = lenA > lenB ? lenA : lenB;
        boolean overflow = false;
        int nTakeOver = 0;
        //高位补零
        if(lenA < lenB) {
            for(int i = lenA; i < maxLen; i++) {
                sbA.append("0");
            }
        }else if(lenA > lenB) {
            for(int i = lenB; i < maxLen; i++) {
                sbB.append("0");
            }
        }

        System.out.println(sbA.toString());
        System.out.println(sbB.toString());

        for(int i = 0; i < maxLen; i++) {
            //加进位
            int nSum = Integer.parseInt(sbA.charAt(i)+"") + Integer.parseInt(sbB.charAt(i)+"") + nTakeOver;
            if(nSum >= 10) {
                if(i == (maxLen-1)){
                    overflow = true;
                }
                nTakeOver = 1;
                result.append(nSum-10);
            }else {
                nTakeOver = 0;
                result.append(nSum);
            }
        }
        if(overflow) {
            result.append(nTakeOver);
        }
        return result.reverse().toString();
    }

3. 整数排序

实现输入一组大于零的整数,根据从小大数排序,排序后有连续数时,只输出最小和最大的数
输入: 1, 4, 3, 110, 2, 90, 7
输出: 1 4 7 90 110

    //相等也算连续
    public static void sortInteger(int[] arr) {
        if(arr == null || arr.length == 0)
            return;
        Arrays.sort(arr);
        int len = arr.length;
        int min = 0, max = 0;
        for(int i = 0; i < len; i++) {
            min = max = arr[i];
            System.out.print(min + " ");
            if(i == (len-1))
                break;
            while((arr[i+1] - 1) == arr[i] || arr[i+1] == arr[i]) {
                i++;
                max = arr[i];
                if(i == (len-1))
                    break;
            }
            if(min != max)
                System.out.print(max + " ");
        }
    }

你可能感兴趣的:(华为)