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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mortonnnn 中级黑马   /  2015-7-19 06:59  /  435 人查看  /  5 人回复  /   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()


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

5 个回复

倒序浏览
学习一下。。。
回复 使用道具 举报
蔡锐 来自手机 中级黑马 2015-7-19 10:07:42
藤椅
学习了,感谢楼主的代码
回复 使用道具 举报
多谢分享
回复 使用道具 举报
  1. static int method(int[] arr) {
  2.                 int max = 0, temp = 0;
  3.                 for (int i = 0; i < arr.length; i++) {
  4.                         temp += arr[i];

  5.                         if(temp < 0)
  6.                                         temp = 0;
  7.                        
  8.                         if (temp > max)
  9.                                     max = temp;
  10.                        
  11.                 }

  12.                 if (max <= 0) {
  13.                         for (int i = 0; i < arr.length; i++) {
  14.                                 if (arr[i] > max) {
  15.                                         max = arr[i];
  16.                                 }
  17.                         }
  18.                 }

  19.                 return max;

  20.         }
复制代码


看看这个怎么样??
回复 使用道具 举报
够作为学习日记了,我也是昨天刚看到这个知识点的,求两个字符串中最大的相同子串
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马