首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

求一算法,欢迎大伙儿积极讨论

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

求一算法,欢迎大家积极讨论
一个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]);

}
}

}

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


Java code
package com.csdn;import java.util.ArrayList;import java.util.List;import com.sun.java_cup.internal.internal_error;public class TestList {    //size>1    public static List getInt(int size){        List childList = new ArrayList();        for(int i = 0;i<size;i++){            childList.add(i+1);        }        return childList;    }    //随机从LIST中获得n个数字(不重复)用于---截断---(eg:123,456,6,789,10)    public static List getFatherList(int m,List childList ,int max) {        int n = childList.size();             List listnew = new ArrayList();        n--;        for(int i = 0;i<childList.size()&&m>0;i++,m--) {            //随机获得一个            int charIndex = (int) Math.floor(Math.random() * n);            //加入            listnew.add(childList.get(charIndex));            //加了后去掉            childList.remove(charIndex);            }        listnew.add(max);        return listnew;        }    //将随机获得LIST转换为数组        public static int[] getFatherListInt(List faList){        int[] getIs = new int[faList.size()];        for(int i = 0;i<faList.size();i++){            getIs[i]=(Integer)faList.get(i);                    }                return getIs;    }        //对随机获得的进行排序    public static int[] Sort(int[] a){        int len = a.length;        for(int i = len-1;i>=1;i--){            for(int j = 0;j<=i-1;j++){                if(a[j]>a[j+1]){                    int temp = a[j];                     a[j]=a[j+1];                    a[j+1]=temp;                }            }        }        return a;    }        //获得eg String[0]="123,",string[2]="56789"    public static String[] getSortString(int[] a,int max){        boolean flag = false;        String [] strings = new String[a.length];        int m = 0;           for(int i = 0;i<a.length;i++){            if(flag){                break;            }            StringBuffer s = new StringBuffer();            if(i-1<0){                for(int j =0;j<a[i];j++){                    m++;                    s.append(String.valueOf((m)));                    s.append(",");                }                            }else{                for(int j = a[i-1];j<a[i];j++){                    m++;                    s.append(String.valueOf((m)));                    s.append(",");                    if(m==max){                        flag=true;                        break;                    }                }                            }                        strings[i]=s.toString();        }            return strings;    }    //输入参数(5,15),返回第2个元素的第2开始,第4个元素的第1个结束         public static void getResult(int i,int j,String[] aStrings){        String a = String.valueOf(i);        String b = String.valueOf(j);                for(int n= 0;n<aStrings.length;n++){            String[] childStrings = aStrings[n].split(",");            for(int m = 0;m<childStrings.length;m++){                if(childStrings[m].equals(a)){                    System.out.println(a+"--is第--"+(n+1)+"--个元素的第--"+(m+1)+"--个");                }                if(childStrings[m].equals(b)){
[解决办法]
题目得意思理解了
暂时用 java list<Integer> 代表列表,用int型代表是几个元素
不管开始位置还是结束位置都是在数组中找到对应的几个元素,的第几个位置,所以可以用一个方法解决
通过累加的方式判断输入的index在哪个元素中,减去前边累加的数据得到位置序号

Java code
import java.util.ArrayList;import java.util.List;public class ArraysTest {    private List<Integer> list = new ArrayList<Integer>();    public ArraysTest(List<Integer> _list)     {        list = _list;    }    public String getResultValues(int begin,int end)    {        return getValues(begin)+","+getValues(end);    }        public String getValues(int index)    {        int sum =0;        int postion= 0;        int postionIndex= 0;        String result = "";                for (int i = 0; i < list.size(); i++)         {            if (sum < index)            {                sum = sum+list.get(i);            }            else            {                postion= i;                postionIndex= index - (sum -list.get(i-1));                return String.valueOf(postion)+","+String.valueOf(postionIndex);            }        }        if (sum >= index)        {            postion= list.size();            postionIndex= index - (sum -list.get(list.size()-1));            return String.valueOf(postion)+","+String.valueOf(postionIndex);        }        return result;    }    /**     * @param args     */    public static void main(String[] args)     {        ArrayList<Integer> list = new ArrayList<Integer>();        list.add(3);        list.add(7);        list.add(4);        list.add(17);        ArraysTest test = new ArraysTest(list);        System.out.println(test.getResultValues(31, 31));    }} 


[解决办法]
不冷清,我还在啊,哈哈。贴我的代码吧,不过其实可以用HashMap实现,把List里的数组作为map的value,key就是list里每个数组的长度,然后再来比较输出。不过我的代码就是最直接的 复制到数组中 然后遍历输出:

Java code
import java.util.*;public class FindElements {    static List<int[]> list = new ArrayList<int[]>();    static int arrayLength;        public static void findElements(int start, int end){        arrayLength = 0;                if(start > end){            System.err.println("Error! Start > End!");            return;        }        Iterator<int[]> iterator = list.iterator();                while(iterator.hasNext())            arrayLength += iterator.next().length;                if (end > arrayLength){            System.err.println("Error! End is over the maximum!");            return;        }                int[] tempArray = new int[arrayLength];        int count = 0;                Iterator<int[]> iterator1 = list.iterator();                while(iterator1.hasNext()){            int[] intArray = iterator1.next();                        for(int i=0; i<intArray.length; i++){                tempArray[count] = intArray[i];                count++;            }        }                for(int i=start-1; i<end; i++)            System.out.print(tempArray[i] +" ");                System.out.println();    }        public static void main(String args[]){                int[] intArray1 = {1, 4, 6, 8};        int[] intArray2 = {1, 14, 6, 5, 18, 22};        int[] intArray3 = {1, 22, 36};        int[] intArray4 = {91, 4, 6, 866, 55, 21, 72};                list.add(intArray1);        list.add(intArray2);        list.add(intArray3);        list.add(intArray4);                findElements(3, 7);        findElements(6, 14);    }}
[解决办法]
private short GetElememntPos(short start, short end, 
ref short se, ref short sp, ref short ee, ref short ep)
{
short ret = 0;
if (start > end) { return -1; }

Dictionary<short, short> container = new Dictionary<short, short>();
container.Add(1, 3);
container.Add(2, 7);
container.Add(3, 4);
container.Add(4, 17);

short total = 0;
bool SettedStart = false;
sp = start;
ep = end;
foreach (KeyValuePair<short, short> kvp in container)
{
total += kvp.Value;
if (!SettedStart)
{
if (total >= start)
{
se = kvp.Key;
SettedStart = true;
}
else { sp -= kvp.Value; }
}

if (total >= end)
{
ee = kvp.Key;
break;
}
else { ep -= kvp.Value; }
}
return ret;
}
private void button2_Click(object sender, EventArgs e)
{
short[] data = new short[4];
GetElememntPos(5, 15, ref data[0], ref data[1], ref data[2], ref data[3]);
}

热点排行