gpt4 book ai didi

java - 从排序数组中排除结尾零和重复元素

转载 作者:行者123 更新时间:2023-12-01 18:18:08 25 4
gpt4 key购买 nike

我的 Java 作业遇到了问题,我必须对数组进行排序并按升序打印数组,排除空索引和重复项。

我已经弄清楚了项目的大部分内容,但我不确定如何排除在数组末尾得到的结尾零。任何帮助将不胜感激。

/* Project4.java  InsertInOrder with bSearch optimization to compute insertion index */
// YOUR NAME/ID:

import java.util.*;
import java.io.*;

public class Project4
{
static final int INITIAL_CAPACITY = 5;

public static void main( String args[] ) throws Exception
{
if (args.length < 1 )
{
System.out.println("ERROR: Must put input filename on cmd line\n");
System.exit(0);
}

Scanner infile = new Scanner( new File( args[0] ) );

int[] arr = new int[INITIAL_CAPACITY];
int count= 0;

while ( infile.hasNextInt() )
{
if ( count==arr.length ) arr = upSizeArr(arr);
if (insertInOrder( arr, count, infile.nextInt() ) )
++count;
}

arr=trimArr(arr,count); // Now count == .length
printArray( arr ); // we trimmed it thus count == length so we don't bother to pass in count

}

// ############################################################################################################

static void printArray( int[] arr )
{
for( int i=0 ; i<arr.length ;++i )
System.out.print(arr[i] + " " );
System.out.println();
}

static int[] upSizeArr( int[] fullArr )
{
int[] upSizedArr = new int[ fullArr.length * 2 ];
for ( int i=0; i<fullArr.length ; ++i )
upSizedArr[i] = fullArr[i];
return upSizedArr;
}

static int[] trimArr( int[] oldArr, int count )
{

int[] trimmedArr = new int[ count ];
int j=0;

for(int i=0;i<count-1;i++)
{
int currentElement =oldArr[i];
if(currentElement!=oldArr[i+1])
trimmedArr[j++]=currentElement;

}
trimmedArr[j++]=oldArr[count-1];
return trimmedArr;

}

static boolean insertInOrder( int[] arr, int count, int newVal )
{
int idx = bSearch( arr, count, newVal );
if ( idx < 0 )
idx=-(idx+1);
int pos = count;
while(pos>0 && newVal<(arr[pos-1]))
{
arr[pos]=arr[pos-1];
pos--;
}
arr[idx] = newVal;
return true;
}

static int bSearch(int[] a, int count, int key)
{
int lo =0;
int hi=count-1;
int mid = 0;
while(lo<=hi)
{
mid=lo +(hi-lo)/2;
if(a[mid]>key)
hi=mid-1;
else if(a[mid]<key)
lo=mid+1;
else
return -(mid+1);
}
return -(lo+1);
}
}

输入文件P4input.txt:

100 89 65 46 32 90 50 38 67 71 42 92 99 57 90 89 98 34 85 19 60 15 99 79 57

最佳答案

您需要创建一个长度等于剩余元素的新数组,将元素复制到其中,然后返回这个新数组。

按如下方式更改 trimArr 的定义来解决该问题:

static int[] trimArr(int[] oldArr, int count) {    
int[] tempArr = new int[count];
int j = 0;

for (int i = 0; i < count - 1; i++) {
int currentElement = oldArr[i];
if (currentElement != oldArr[i + 1])
tempArr[j++] = currentElement;

}
tempArr[j++] = oldArr[count - 1];

int[] trimmedArr = new int[j];
for (int i = 0; i < j; i++) {
trimmedArr[i] = tempArr[i];
}
return trimmedArr;
}

注意:此类问题最好使用动态列表来解决,例如数组列表。但是,您的老师可能不允许在这个阶段使用 ArrayList

关于java - 从排序数组中排除结尾零和重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60327186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com