根据最大宽度求动态列数
需求是这样:
给定一个最大的宽度maxWidth,给出一个动态的数组数据源,数组中的数据为int型,值在0-maxWidth之间,想把这些数据以表格形式显示,显示规则为:每列的行数初始值是12,当数据排列完毕后,每列中所有行数的最大值相加,如果相加结果,超过最大的宽度maxWidth,则把行数的初始值+1,重新计算,直到每列的行数最大值之和不大于maxWidth时,计算完毕。
下面是我的一个实现:
/** * Description * 2012-11-19 * @author jzq */public class TestRow {/** * return maxValue */static int getMax(int[] v){for(int i=0;i<v.length-1;i++){if(v[i]>v[i+1]){int temp = v[i];v[i] = v[i+1];v[i+1] = temp;}}return v[v.length-1];}/** * row: 每列显示的行数 */static int getRow(int[] v, int maxVal, int row){int len = v.length;// 列数int column = len/row;int remainder = len%row;int width = 0;int flag = 0;for(int i=0;i<column;i++){int[] temp = new int[row];for(int j=0;j<row;j++){temp[j] = v[i*row+j];}width += getMax(temp);if(width>maxVal){flag = 1;break;}}if(flag==1){return getRow(v, maxVal, row+1);} else {if(remainder>0){int[] temp = new int[remainder];for(int i=0;i<remainder;i++){temp[i] = v[column*row+i];}width += getMax(temp);}if(width>maxVal){return getRow(v, maxVal, row+1);}}return column;}/** * Description */public static void main(String[] args) {int[] v = new int[60];for(int i=0;i<60;i++){int x = (int) (Math.random()*100);v[i] = x;}System.out.println(getRow(v, 1000, 12));}}
算法的原理是:?
首先求出数组的总长度len,然后Len与row相除与求模,除的结果数为列数column,把每列中最大行数的值相加得出width,与maxWidth比较,看是否越界,越界则把row+1,重新计算。如果计算完没越界,再看求模的余数remainder,看remainder的值是否为0,如不为0,再计算出最后一列remainder个元素中的最大行数,和前面计算的width相加,再与maxWidth比较,看是否越界,若越界则把row+1,重新计算。
?