有一个数字串array,包含100个正数和负数随机分布,要找到他的一个子串array[i...j]
(0<=i<=j<=100),使得在arry的所有子串中,array[i...j]的和最大,比如:串{1,-3,5,-2,6}的最大子串为{5,-2,6}
思路:
先一个嵌套循环,得出所有的子串(这里要用到数组的切割),然后再将每一个子串的和加起来
(有点类似于选择排序的那个意思)
代码:
public class Test02 {
public static void main(String[] args){}
public int[] maxChildArr(int[] arr){
for(int i ; i <100 ; i ++){
for(int j = i +1 ; j <101 ; j++){
//获取分割后的所有数组
int[] intArray = Arrays.copyOfRange(arr,i,j);
//遍历求和
ArrayList al = new ArrayList(Arrays.asList(intArray));
Iterator iterator = al.iterator();
int count ;
while(iterator.hasNext()){
count += iterator.next();
}
//然后将intArray和count都放在一个集合中,两者对应的序号一致,就可以找到最值并且知道对应哪个子数组
//将arrayList转为int[]
int[] intArray = al.toArray();
//利用泛型,把数组放在一个集合里
LinkedList<int[]> ll = new LinkedList()<int[]>;
ll.add(intArray);
//存入count到一个集合中
ArrayList arrList = new ArrayList();
arrList.add(count);
}
}
//好像没有直接求数组最大值的api
int[] i = arrList.toArray();
int[] ii = i.sort();
int max = ii[ii.length -1];
int index= Arrays.binarySearch(i,max);
int[] target = ll.get(index);
return target;
}
本题小结:
几个点:
(1):知识点:数组,Arrays类(其实有学过,但是很容易忘记)
(2):思路,实现方法
这里要特别注意数组的使用:
0.打印java数组的元素:
int[] intArray = {1,2,3,4,5};
String intArrayString = Arrays.toString(intArray);
System.out.println(intArray);
System.out.println(intArrayString);
第一行的结果:[@715obd4d,因为这仅仅是一个地址引用
第二行的结果:[1,2,3,,4,5],因为它经过了Arrays.toString()的转化
1.从Array中创建List:
List list = Arrays.asList(arr);
2.从Array中创建ArrayList:
好处:ArrayList是动态链表,可以更加方便地进行增删改差
注意这里要用到泛型
ArrayList arrList = new ArrayList(Arrays.asList(arr));
3.判断一下数组是否存在某个元素
复习一下集合类:
Collection下面有俩主要接口:List和Set
而List的主要实现类是ArrayList,LinkedList和Vector
boolean contains(Object o)是Collection的一个方法了
boolean b = Arrays.asList(arr).contains(3);
//boolean b = Arrays.asList(arr).contains("feriosa");
也就是说,所谓数组,并不是只能是整数的集合,也能是其他数据类型,如浮点数和字符串
4.两个数组的连接:
int[] arr= ArrayUtils.addAll(arr1,arr2);
ArrayUtils是一个类似Arrays的工具类,也是数组专用
5.将Array转化为Set集合:
先复习一下List和Set之间的转化:
List list = new ArrayList(set);
Set set = new HashSet(list);
这俩类的构造方法可以互传的= =
Set set = new HashSet(Arrays.asList(arr));
6.数组翻转:
依然是ArrayUtils中的方法:
int[] arr = { 22,33,44,55,66};
int[] i = ArrayUtils.reverse(arr);
System.out.println(Arrays.toString(i));
7.从数组中移除一个元素:
这种方法就不少了:
1)转化为List类,然后执行增删改差操作
2)用ArrayUtils来直接操作数组
int[] removed = ArrayUtils.removeElement(arr,0);
Arrays工具类---专属于数组的工具类
sort(),binarySearch(int[] a , int key),copuOfRange(int[] original,int from,int to)---这个方法的名字很搞笑,但很重要,
fill(int[] arr,int val)---val把数组中所有的数都替换了,toString(int[] arr);
最后还有一个很重要的方法:
asList(int[] arr)---实现数组与动态链表的转换
发散出去:
所有Object的子类都有四个共有方法:
finalized()---被回收前调用
toString()
equals()
hashCode()
做一道题就可以复习好多知识
|
|