南星&北斗 2015-07-12 14:24 采纳率: 0%
浏览 2053
已采纳

排序重构的问题,求解答

令A为一个由N个已特殊排序数组成的数列:A1,A2,…,AN,其中A1=0。令B为N(N-1)/2个数(定义为Dij=Ai-Aj(i>j))组成的数列。例如,A=0,1,5,8,那么D=1,3,4,5,7,8。请完成:
a) 编写程序,根据A构造D;
b) 编写程序,构造与D相对应的某一个数列A,注意A不是唯一的

  • 写回答

3条回答 默认 最新

  • JonsonJiao 2015-07-13 02:11
    关注
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class ArrayDemo {
    
        public static void main(String[] args) {
            Integer[] aArray = new Integer[] { 0, 1, 5, 8 };
    
            // 第一步获取D数组
            System.out.println("根据A计算得到的数组D:");
            Integer[] dArray = getDArray(aArray);
    
            for (int i = 0; i < dArray.length; i++) {
                System.out.println(dArray[i]);
            }
            // 第二步根据D数组反求A数组
            System.out.println("反求得到的数组A:");
            Integer[] _aArray = getAArray(dArray);
            for (int i = 0; i < _aArray.length; i++) {
                System.out.println(_aArray[i]);
            }
        }
    
        /**
         * 构造与D相对应的某一个数列A,注意A不是唯一的
         * 
         * @param dArray
         * @return
         */
        private static Integer[] getAArray(Integer[] dArray) {
            int dLen = dArray.length;
            int aLen = getALen(dLen);
            if (aLen == 0) {
                System.err.println("计算A的数组出错,请确认传入的D数组有效。");
                return null;
            }
    
            // 因为A1必须为0,可以直接确定A1,并设置A最后一个值为D的最后一个值,保证了最大值。同时A2=A1+D1,A3=A2+D2,依次类推,认为D是有序数组,遍历D数组得到中间A的所有数据
            Integer[] aArray = new Integer[aLen];
            aArray[0] = 0;
            aArray[aLen - 1] = dArray[dLen - 1];
            for (int i = 1; i < aLen - 1; i++) {
                aArray[i] = aArray[i - 1] + dArray[i];
            }
            return aArray;
        }
    
        /**
         * 根据传入的D数组的长度求出A数组的长度来,就是解一元二次方程n*n-n=2*dLen,n代表A数组的长度
         * 
         * @param dLen
         * @return
         */
        private static int getALen(int dLen) {
            for (int n = 2; n <= 2 * dLen; n++) {
                if (n * n - n - 2 * dLen == 0) {
                    return n;
                }
            }
            return 0;
        }
    
        /**
         * 令aArray为一个由N个已特殊排序数组成的数列:A1,A2,…,AN,其中A1=0。令D为N(N-1)/2个数(定义为Dij=Ai-Aj(i>j
         * )组成的数列。例如,A=0,1,5,8,那么D=1,3,4,5,7,8
         * 
         * @param aArray
         * @return
         */
        private static Integer[] getDArray(Integer[] aArray) {
            int aLen = aArray.length;
            int dLen = aLen * (aLen - 1) / 2;
            List<Integer> tempList = new ArrayList<Integer>();
            for (int i = 0; i < aArray.length; i++) {
                for (int j = i + 1; j < aArray.length; j++) {
                    if (tempList.size() == dLen) {
                        i = aLen;
                        break;
                    } else {
                        tempList.add(aArray[j] - aArray[i]);
                    }
                }
            }
            Integer[] dArray = tempList.toArray(new Integer[0]);
            Arrays.sort(dArray);
            return dArray;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 ensp,用局域网解决
  • ¥15 Python语言实验
  • ¥15 我每周要在投影仪优酷上自动连续播放112场电影,我每一周遥控操作一次投影仪,并使得电影永远不重复播放,请问怎样操作好呢?有那么多电影看吗?
  • ¥20 电脑重启停留在grub界面,引导出错需修复
  • ¥15 matlab透明图叠加
  • ¥50 基于stm32l4系列 使用blunrg-ms的ble gatt 创建 hid 服务失败
  • ¥150 计算DC/DC变换器平均模型中的参数mu
  • ¥25 C语言代码,大家帮帮我
  • ¥15 请问以下文字内容及对应编码是用了什么加密算法或压缩算法呢?
  • ¥50 关于#html5#的问题:H5页面用户手机返回的时候跳转到指定页面例如(语言-javascript)