A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mortonnnn 中级黑马   /  2015-7-20 21:59  /  145 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有一个数字串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()


做一道题就可以复习好多知识

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马