那一篇是已经排过序了的。 如果没排过序的话,我觉得,应该先排序再比较,可能会快点。排序之后的比较,最普遍的方法就是用相邻的比较。 不过特殊情况用特殊方法。另一朋友提出用二分法。我觉得提议非常不错。 二分法适用于,重复比较多的情况下(不完全是最大值与最小值的差比较小的情况)。 例如,长度1000的数组。数值范围为0~19 其中可能有3、4个数不会出现。 这时,大概15个数字,出现在长度1000的数组里,重复的数就比较多了。 这时用二分法,效率就会高很多。public class Main { public static void main(String[] args) { int[] src = new int[1000]; Set<Integer> set = new HashSet<Integer>(); Random r = new Random(); for (int i = 0; i < 5; i++) { set.add(r.nextInt(20)); } for (int i = 0; i < src.length; i++) { int j = r.nextInt(20); if (!set.contains(j)) { src[i] = j; } } Arrays.sort(src); src = g(src); for (int i : src) { System.out.print(i + " "); } System.out.println("\n" + src.length); } public static int[] g(int[] src) { int k = 0; while (src[k] < src[src.length - 1]) { int x = Arrays.binarySearch(src, k + 1, src.length, src[k] + 1); src[++k] = x > 0 ? src[x] : src[-x - 1]; } return Arrays.copyOf(src, k + 1); } }
public class ArraysTest { public static void main(String []args) { int []arrays=new int[20];
查找相同的肯定要做比对,这是一个循环
假设位置0和位置7重复,肯定是循环7次后发现重复,然后把8位提到7位 9位提到8位……
然后数组长度缩短
(我说记不住的是这个长度缩短我忘记是操作本来的那个数组还是创建了一个新的长度-1的数组
楼主回头查下api吧)
public class Sort1 {//排序
public static void sort(int[] arr){
for(int i = 0;i < arr.length;i++){
int k =i;
for(int j=k;j < arr.length;j++){
if(arr[j] < arr[k]){
k = j;
}
}
if(k != i){
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
}
public static int[] deleteMulti(int[] arr){//删除
int m = 0;
int n = 0;
while(m < arr.length){
arr[n] = arr[m];
while(arr[n] == arr[m]){
m++;
if(m == arr.length){
break;
}
}
n++;
}
int[] newNum = new int[n];
for(int i = 0;i < n; i++)
newNum[i] = arr[i];
return newNum;
}
public static void main(String[] args) {
int[] arr = {7,8,5,4,2,6,4,8,7,6,2,6,9};
sort(arr);
int[] newarr = deleteMulti(arr);//用一个数组存排序好的,算不算?
for(int i:newarr){
System.out.print(" " + i);
} }}
ArrayList<Integer> arrayList = new ArrayList<Integer>();
for (int i = 0; i < arr.length; i++) {
if (!arrayList.contains(arr[i])) {
arrayList.add(arr[i]);
}
}
Object[] aa =arrayList.toArray() ;
Arrays.sort(aa) ;
for (int i = 0; i < aa.length; i++) {
System.out.println(aa[i]);
}
// TODO Auto-generated method stub
int[] arr = {7,8,5,4,2,6,4,8,7,6,2,6,9};
Arrays.sort(arr);//排序(从小到大)
for(int i=0;i<arr.length-1;i++){
if(arr[i]<arr[i+1]){
continue;
}else{
arr[i] = Integer.MIN_VALUE;//如果不比后一位小,设为最小值
}
}
int k = 0;
//把有效数插到数组中
for(int i=0;i<arr.length;i++){
if(arr[i]>Integer.MIN_VALUE){
arr[k] = arr[i];
k++;
}
}
多余的设为最小值
while(k<arr.length){
arr[k] = Integer.MIN_VALUE;
k++;
}
for(int i:arr){
System.out.print(i+" ");
}
}
输出:2 4 5 6 7 8 9 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648
如果没排过序的话,我觉得,应该先排序再比较,可能会快点。排序之后的比较,最普遍的方法就是用相邻的比较。
不过特殊情况用特殊方法。另一朋友提出用二分法。我觉得提议非常不错。
二分法适用于,重复比较多的情况下(不完全是最大值与最小值的差比较小的情况)。
例如,长度1000的数组。数值范围为0~19
其中可能有3、4个数不会出现。
这时,大概15个数字,出现在长度1000的数组里,重复的数就比较多了。
这时用二分法,效率就会高很多。public class Main { public static void main(String[] args) {
int[] src = new int[1000];
Set<Integer> set = new HashSet<Integer>();
Random r = new Random();
for (int i = 0; i < 5; i++) {
set.add(r.nextInt(20));
}
for (int i = 0; i < src.length; i++) {
int j = r.nextInt(20);
if (!set.contains(j)) {
src[i] = j;
}
}
Arrays.sort(src);
src = g(src);
for (int i : src) {
System.out.print(i + " ");
}
System.out.println("\n" + src.length);
} public static int[] g(int[] src) {
int k = 0;
while (src[k] < src[src.length - 1]) {
int x = Arrays.binarySearch(src, k + 1, src.length, src[k] + 1);
src[++k] = x > 0 ? src[x] : src[-x - 1];
}
return Arrays.copyOf(src, k + 1);
}
}
{
public static void main(String []args)
{
int []arrays=new int[20];
int temp=1;
for(int i=0;i<arrays.length;i++)
{
arrays[i]=new Random().nextInt(25);
}
Arrays.sort(arrays);
for(int i:arrays)
{
System.out.print(i+" ");
}
System.out.println();
for(int i=1;i<arrays.length;i++)
{
if(arrays[i-1]!=arrays[i])
temp++;
}
int []TempArrays=new int[temp];
temp=0;
TempArrays[0]=arrays[0];
for(int i=1;i<arrays.length;i++)
{
if(arrays[i-1]!=arrays[i])
TempArrays[++temp]=arrays[i];
}
for(int i:TempArrays)
{
System.out.print(i+" ");
}
System.out.println();
}
}