数组题(2021-7-3)

这篇博客探讨了如何在Java中实现数组的特定操作。首先,介绍了一种方法将数组元素排列成最小数字,通过比较数字拼接后的大小进行快速排序。接着,详细阐述了使用归并排序解决数组逆序对问题的思路。最后,展示了如何利用二分查找来计算排序数组中特定数字出现的次数。这些算法在数组处理和排序中具有重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.把数组排成最小的数

import java.util.ArrayList;
public class Solution{
   public String PrintMinNumber(int [] numbers){
   if(numbers==null||numbers.length==0) return "";
   //快排
   for(int i=0;i<numbers.length;i++){
     for(int j=i+1;j<numbers.length;j++){
        int sum1=Integer.valueOf(numbers[i]+""+numbers[j]);
        int sum2=Integer.valueOf(numbers[j]+""+numbers[i]);
        if(sum1>sum2){
        int temp=numbers[j];
        numbers[j]=numbers[i];
        numbers[i]=temp;
        }
     }
   }
   String str=new String("");
   for(int i=0;i<numbers.length;i++)
   str=str+numbers[i];
   return str;
   }
}
思路:1.将数组中的数先排序(在排序的过程中依次将整型字符串数组转换成String字符串)
        1.1 自定义numbers[i],numbers[j]两个函数,先将他们拼接起来,比较numbers[i]+numbers[j]和
        numbers[j]+numbers[i]哪个大。numbers[i]+numbers[j]如果大,那么应该numbers[j]放在前面。
     2.将排好序的字符串依次拼接好输出。

2.数组中的逆序对

public class Solution{
  int count=0;
  public int InversePairs(int [] array){
    if(array==null)  return 0;
    mergeSort(array,0,array.length-1);
    return count;
  }
  private void mergeSort(int[] data,int start,int end){//把数组划分成左,中,右
  int mid=(start+end)/2;
  if(start<end){
      mergeSort(data,start,mid);
      mergeSort(data,mid+1,end);
      merge(data,start,mid,end);
    }
  }
  private void merge(int[] data,int start,int mid,int end){
  int arr[]=new int[end-start+1];
  int c=0;
  int s=start;
  int index=mid+1;
  while(start<=mid&&index<=end){
         if(data[start]<data[index]){
            arr[c++]=data[start++];
         }else{
             arr[c++]=data[index++];
             count+=mid+1-start;
             count%=1000000007;
         }
    }
    while(start<=mid){
      arr[c++]=data[start++];
    }
    while(index<=end){
    arr[c++]=data[index++];
    }
    for(int d:arr){
    data[s++]=d;
    }
  }
}
思路:使用归并排序

3.数字在排序数组中出现的次数

public class Solution{
  public int GetNumberOfK(int [] array,int k){
  if(array.length==0)  return 0;
  return this.binarySearch(array,0,array.length-1,k);
  }
  private static int binarySearch(int[] array,int left,int right,int k){
   if(left>right) return 0;
   int mid=(left+right)/2;
   int midVal=array[mid];
   int count=0;
   if(k<minVal){
   return binarySearch(array,left,mid-1,k);
   }else if(k>minVal){
   return binarySearch(array,mid+1,right,k);
   }else{
   //当k==minVal时,再向左和向右寻找k的个数
   int leftMid=mid;
   int rightMid=mid+1;
   //向左
   while(leftMid>=0&&k==array[leftMid]){
   count++;
   leftMid--;
   }
   //向右
   while(rightMid<=array.length-1&&k==array[rightMid]){
   count++;
   rightMid++;
   }
   return count;
   }
  }
}
思路:用递归+二分查找
1.调用二分查找方法
2.编写二分查找方法:定义中间索引,和中间值,和计数器;
3.用目标值和中间值比较,如果比中间值小,就在中间值的左边继续用二分法查找;
                      如果比中间值大,就在中间值的右边继续用二分法查找;
                      如果等于中间值,就在左边和右边分别寻找目标值的数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值