华为机试

来源:互联网 发布:js placeholder赋值 编辑:程序博客网 时间:2024/05/16 01:51

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 + " ");        }    }
0 0