剑指 Offer 45. 把数组排成最小的数
class Solution {
public String minNumber(int[] nums) {
String[] str=new String[nums.length];
for(int i=0;i<nums.length;i++) str[i]=String.valueOf(nums[i]);
Arrays.sort(str,new Comparator<String>(){
//public String compare(String o1,String o2){
public int compare(String o1,String o2){
String temp1=o1+o2;
String temp2=o2+o1;
return temp1.compareTo(temp2);
}
});
StringBuilder st=new StringBuilder();
for(int i=0;i<str.length;i++){
st.append(str[i]);
}
return st.toString();
}
}
剑指 Offer 61. 扑克牌中的顺子
方法一:
class Solution {
public boolean isStraight(int[] nums) {
Arrays.sort(nums);
int count=0;
for(int i=0;i<nums.length;i++){
if(nums[i]==0){
count++;
}else{
break;
}
}
for(int i=0;i<nums.length-1;i++){
if(nums[i]==0) continue;
if(nums[i]+1==nums[i+1]) continue;
if(count>0){
//注意要防止大小王多了的情况
//if(nums[i]+count+1!=nums[i+1]) return false;
//count=0;
while(count!=0){
count--;
nums[i]++;
if(nums[i]+1==nums[i+1]){
break;
}
}
if(nums[i]+1!=nums[i+1]){
return false;
}
}else if(count<=0){
return false;
}
}
return true;
}
}
方法二:
class Solution {
public boolean isStraight(int[] nums) {
//大神版思路,根据题意,此 55 张牌是顺子的 充分条件 如下:
//除大小王外,所有牌 无重复 ;
//设此 55 张牌中最大的牌为 maxmax ,最小的牌为 minmin (大小王除外),则需满足:
//max - min < 5
Arrays.sort(nums);
int k=0;
for(int i=0;i<4;i++){
if(nums[i]==0) k++;
else if(nums[i]==nums[i+1]) return false;
}
return nums[4]-nums[k]<5;
}
}
剑指 Offer 40. 最小的k个数
方法一:数组排序法
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
//注意数组长度为0时,返回数组的写法
if(k==0) return new int[0];
int[] res=new int[k];
Arrays.sort(arr);
for(int i=0;i<k;i++){
res[i]=arr[i];
}
return res;
}
}
方法二:快排
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
if(arr.length==k) return arr;
if(arr.length==0) return new int[0];
return quicksort(arr,0,arr.length-1,k);
}
public int[] quicksort(int[] arr,int l,int r,int k){
int i=l;
int j=r;
while(i<j){
while(i<j&&arr[j]>=arr[l]) j--;
while(i<j&&arr[i]<=arr[l]) i++;
swap(arr,i,j);
}
swap(arr,l,i);
//注意是递归
// if(i>k) quicksort(arr,l,i-1,k);
// else if(i<k) quicksort(arr,i+1,r,k);
if(i>k) return quicksort(arr,l,i-1,k);
else if(i<k) return quicksort(arr,i+1,r,k);
else{
return Arrays.copyOf(arr,i);
}
}
public void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
同类型题目归纳
215. 数组中的第K个最大元素
class Solution {
public int findKthLargest(int[] nums, int k) {
return quicksort(nums,0,nums.length-1,k);
}
public int quicksort(int[] nums,int l,int r,int k){
int i=l;
int j=r;
while(i<j){
while(i<j&&nums[j]>=nums[l]) j--;
while(i<j&&nums[i]<=nums[l]) i++;
swap(nums,i,j);
}
swap(nums,l,i);
if(i>nums.length-k) return quicksort(nums,l,i-1,k);
else if(i<nums.length-k) return quicksort(nums,i+1,r,k);
else return nums[i];
}
public void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}