1、字符串的排列
public boolean checkInclusion ( String s1, String s2) {
int s1Len= s1. length ( ) ;
int s2Len= s2. length ( ) ;
char [ ] chars= s2. toCharArray ( ) ;
for ( int i = 0 ; i < s2Len; i++ ) {
if ( s1Len== 1 && s2. contains ( s1) ) return true ;
if ( s1. contains ( chars[ i] + "" ) && s1Len> 1 ) {
if ( i+ s1Len<= s2Len) {
int [ ] s11= new int [ 26 ] ;
int [ ] s22= new int [ 26 ] ;
for ( int j= 0 ; j< s1Len; j++ ) {
++ s11[ s1. charAt ( j) - 'a' ] ;
++ s22[ chars[ j] - 'a' ] ;
if ( j== s1Len- 1 && Arrays. equals ( s11, s22) ) return true ;
}
}
if ( i+ 1 - s1Len>= 0 ) {
int [ ] s11= new int [ 26 ] ;
int [ ] s22= new int [ 26 ] ;
for ( int j= 0 ; j< s1Len; j++ ) {
++ s11[ s1. charAt ( j) - 'a' ] ;
++ s22[ chars[ i- j] - 'a' ] ;
if ( j== s1Len- 1 && Arrays. equals ( s11, s22) ) return true ;
}
}
}
}
return false ;
}
2、最小K个数
public int [ ] smallestK ( int [ ] arr, int k) {
int l= 0 ;
int r= arr. length- 1 ;
mergeSort ( arr, l, r) ;
int [ ] res= new int [ k] ;
System. arraycopy ( arr, 0 , res, 0 , k) ;
return res;
}
private static void mergeSort ( int [ ] arr, int l, int r) {
if ( l>= r) return ;
int mid= ( l+ r) >> 1 ;
mergeSort ( arr, l, mid) ;
mergeSort ( arr, mid+ 1 , r) ;
merge ( arr, l, mid, r) ;
}
private static void merge ( int [ ] arr, int l, int mid, int r) {
int s1= l;
int s2= mid+ 1 ;
int [ ] tempArr= new int [ r- l+ 1 ] ;
int i= 0 ;
while ( s1<= mid&& s2<= r) {
if ( arr[ s1] <= arr[ s2] ) tempArr[ i++ ] = arr[ s1++ ] ;
else tempArr[ i++ ] = arr[ s2++ ] ;
}
while ( s1<= mid) {
tempArr[ i++ ] = arr[ s1++ ] ;
}
while ( s2<= r) {
tempArr[ i++ ] = arr[ s2++ ] ;
}
System. arraycopy ( tempArr, 0 , arr, l, tempArr. length) ;
}