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{
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.用目标值和中间值比较,如果比中间值小,就在中间值的左边继续用二分法查找;
如果比中间值大,就在中间值的右边继续用二分法查找;
如果等于中间值,就在左边和右边分别寻找目标值的数量。