日期:2014-05-20  浏览次数:20620 次

求一算法,欢迎大家积极讨论
一个List,数据是这样的,List(3个,7个,4个,17个....) n个代表有多少个元素

要求,写一个函数,传入两个参数,即开始值和结束值,返回此List中第几个元素的第几个开始和第几个元素的第几个结束。

例如 
 输入参数(5,15),返回第2个元素的第2开始,第4个元素的第1个结束 即 2,2,4,1
输入参数(10,20),返回第2个元素的第7开始,第4个元素的第6个结束 即 2,7,4,6

java这里冷清许多了感觉

------解决方案--------------------
在数组上累加就可以算出来了

朴素算法如下,没啥高深技术:

Java code
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;


/**
 * 不规则列表的数据起止判定
 * @author jinxfei
 *
 */
public class BGZList {

    private static Random r=new Random(System.currentTimeMillis());
    
    public static void main(String[] args) throws Exception{
        List<Integer> targetList=createBGZList();
        System.out.println("随机数组:\n"+targetList);
        System.out.println("请输入起始值:\n");
        BufferedReader r=new BufferedReader(new InputStreamReader(System.in));
        int start=Integer.parseInt(r.readLine());
        System.out.println("请输入终止值:\n");        
        int end=Integer.parseInt(r.readLine());
        end-=start;
        int startIndex=0,startPos=0;
        int endIndex=0,endPos=0;
        for(int i=0; i<targetList.size();i++){
            Integer cur=targetList.get(i);
            if (start>=0){
                if (start>cur){
                    start-=cur;                    
                    continue;
                }            
                startIndex=i+1;
                startPos=start;
                start=-1;
            }else{
                if (end>cur){
                    end-=cur;
                    continue;
                }
                endIndex=i+1;
                endPos=end;
                break;
            }
            
        }
        System.out.println("开始于 "+startIndex+" 的 "+startPos+", 结束于 "+endIndex+" 的 "+endPos);
    }
    
    /**
     * 创建一个随机长度(10-110)的list,list中的每一个数字也都是随机的(5-55),
     * 
     * @return
     */
    private static List<Integer> createBGZList(){
        List<Integer> result=new ArrayList<Integer>();
        int listLength=r.nextInt(100)+10;
        for(int i=0; i<listLength;i++){
            result.add(r.nextInt(50)+5);
        }
        return result;
    }
}

------解决方案--------------------
写好了,可能不是很规范 ,但可以得到结果。考到java里面直接可以运行

package a;

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

public class Test {

public static List<int[]> list = new ArrayList<int[]>();

public Test() {
int[] a = { 1, 2, 3 };
int[] b = { 4, 5, 6, 7, 8, 9, 10 };
int[] c = { 11, 12, 13, 14 };
list.add(a);
list.add(b);
list.add(c);
}

public int[] function(int x, int y) {
int[] returnBack = new int[4];
int[] a = get(x);
int[] b = get(y);
returnBack[0] = a[0];
returnBack[1] = a[1];
returnBack[2] = b[0];
returnBack[3] = b[1];
return returnBack;
}

public static int[] get(int x) {
int[] returnBack = new int[2];
int sum = 0;
int cout = 0;
for (int n = 0; n < list.size(); n++) {
sum = sum + (list.get(n)).length;
if (x <= sum && cout == 0) {
cout++;
returnBack[0] = n + 1;
for (int i = 0; i < (list.get(n)).length; i++) {
if (x == list.get(n)[i]) {
returnBack[1] = i + 1;
}
}
}
}

return returnBack;
}

public static void main(String[] args) {
Test test = new Test();
int[] aa = test.function(3, 14);

for (int i = 0; i < aa.length; i++) {
System.out.println(aa[i]);

}
}

}

------解决方案--------------------