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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© z47057554 中级黑马   /  2015-3-4 17:12  /  868 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 z47057554 于 2015-3-4 19:54 编辑

为什么内存溢出,求解



    1. /**
    2. * 第5题: 数组去重复,
    3. * 例如: 原始数组是{4,2,4,6,1,2,4,7,8},得到结果{4,2,6,1,7,8}
    4. * @author
    5. *
    6. *答:分析:已知数组,int[]arr,定义起始标记start,定义方法getNewarr(arr,start),该方法可以得到
    7. *一个数组newarr,newarr在start之后没有元素与arr[start]重复,完动作后,
    8. *getNewarr(newarr,start++);当start从0位置开始时,它每调用一次getNewarr,对应位置在新得到的
    9. *数组中是唯一的,并保留了第一次在原数组中出现的顺序,当start=newarr.length-2时,newarr[start]
    10. *无论是否等于newarr[newarr.length-1],再调用一次,都会得到所有元素唯一的数组
    11. */

    12. public class Test52 {
    13.         public static void main(String[] args) {
    14.                
    15.                 int[] arr={4,2,4,6,1,2,4,7,8};
    16.                
    17.                 System.out.println("原数组为");
    18.                 myPrint(arr);
    19.                
    20.                 System.out.println("去重后数组为");
    21.                 myPrint(getNewarr(arr,0));
    22.         }
    23.         
    24.         public static int[] getNewarr(int[]arr,int start){
    25.                 if(start < arr.length-1){
    26.                         int count=0;
    27.                         for (int i = start+1; i < arr.length; i++) {
    28.                                 if(arr[i]==arr[start])
    29.                                         count++;
    30.                         }
    31.                         
    32.                         int[] newarr=new int[arr.length-count];
    33.                         for (int i = 0; i < start+1; i++) {
    34.                                 newarr[i]=arr[i];
    35.                         }
    36.                         
    37.                         if(count!=0){
    38.                                 int arrnum=start+1;
    39.                                 for (int i = start+1; i < newarr.length; i++) {
    40.                                         for ( ; arrnum < arr.length; arrnum++) {
    41.                                                 if(arr[arrnum]==newarr[start])
    42.                                                         continue;
    43.                                                 else{
    44.                                                         newarr[i]=arr[arrnum];
    45.                                                         arrnum++;
    46.                                                         break;
    47.                                                 }
    48.                                         }
    49.                                 }
    50.                                 return getNewarr(newarr,start++);
    51.                         }
    52.                         
    53.                         else
    54.                                 return getNewarr(arr,start++);
    55.                 }
    56.                
    57.                 else
    58.                         
    59.                         return arr;
    60.         }
    61.         
    62.         public static void myPrint(int[] arr){
    63.                
    64.                 System.out.print("[");
    65.                 for(int i=0;i <arr.length;i++){
    66.                         if(i!=arr.length-1)
    67.                                 System.out.print(arr[i]+",");
    68.                         else
    69.                                 System.out.println(arr[i]+"]");
    70.                 }
    71.         }
    72. }
    复制代码

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 加油~

查看全部评分

3 个回复

倒序浏览
你可以考虑用集合,简单易懂
  1. package com.itheima;

  2. import java.util.ArrayList;

  3. /*
  4. *  8、 数组去重复,例如: 原始数组是{4,2,4,6,1,2,4,7,8},得到结果{4,2,6,1,7,8}
  5. */
  6. public class Test8 {

  7.         public static void main(String[] args) {
  8.                 // TODO 自动生成的方法存根
  9.                
  10.                
  11.                 int [] arr={4,2,4,6,1,2,4,7,8};
  12.                
  13.                 //调用去重方法
  14.                 Object [] b=getArray(arr);
  15.                
  16.                 //打印数组元素
  17.                 for(int i=0;i<b.length;i++)
  18.                 {
  19.                         System.out.println(b[i]);
  20.                 }
  21.                
  22.                
  23.         }
  24.         //利用集合中的contains去除重复元素
  25.         public static Object [] getArray(int []arr)
  26.         {
  27.                 //定义集合
  28.                 ArrayList<Integer> list =new ArrayList<Integer>();
  29.                
  30.                 //遍历数组
  31.                 for(int i=0;i<arr.length;i++)
  32.                 {
  33.                         //集合中没有这个元素时,才添加,避免添加重复元素;这里有自动装箱.
  34.                         if(!list.contains(arr[i]))
  35.                                 list.add(arr[i]);
  36.                 }
  37.                
  38.                 //集合变数组
  39.                 return  list.toArray();       
  40.                
  41.         }

  42. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 很给力!

查看全部评分

回复 使用道具 举报
zfgrinm 发表于 2015-3-4 19:44
你可以考虑用集合,简单易懂

看了许久自己发现了,是后置++,先传值,后自增的特点导致的,递归的参数始终是初始值导致的

start++,换成 ++start,就能正确运行了

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 很给力!

查看全部评分

回复 使用道具 举报
加油!自己好好调吧,元宵节快乐!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马