求一算法,欢迎大家积极讨论
一个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这里冷清许多了感觉
[解决办法]
在数组上累加就可以算出来了
朴素算法如下,没啥高深技术:
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]);
}
}
}
------解决方案--------------------
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在哪个元素中,减去前边累加的数据得到位置序号
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里每个数组的长度,然后再来比较输出。不过我的代码就是最直接的 复制到数组中 然后遍历输出:
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]);
}