快速排序(学习里面的双指针的思想)
public class quicksort {
public static void swap(int[] a,int i,int j)
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static void quicksort(int[] a,int begin,int end)
{
if(begin<end)
{
int i=begin;
int j=end;
int temp= a[begin];
while(i<j)
{
while(temp>=a[j]&&i<j)
{
j--;
}
while(temp<=a[i]&&i<j)
{
i++;
}
swap(a,i,j);
}
swap(a,i,begin);
quicksort(a,begin,i-1);
quicksort(a,i+1,end);
}
}
public static void main(String arg[])
{
int[] num= {23,45,17,11,13,89,72,26,3,17,11,13};
int n = 12;
quicksort(num,0,n-1);
for(int i=0;i<n;i++)
System.out.print(num[i]+",");
}
}
利用快速排序双指针思想求解交换次数
public static void solution(String s)
{
int i=0;
int j=s.length()-1;
int ans=0;
char[] a=s.toCharArray();
for(;i<j;++i,--j)
{
for(;(i<j)&&(a[i]=='0');++i){}
for(;(i<j)&&(a[j]=='1');--j){}
if(i<j)ans++;
else break;
}
System.out.print(ans);
}
双指针思想求交换里面的符号(只会通过交换完成任务,但是快排是不稳定排序会改变数字的相对位置呀!!);
public static void solution2(String s)
{
int i=0;
int j=s.length()-1;
int ans=0;
char[] a=s.toCharArray();
for(;i<j;--j)
{
if(a[j]=='*')
{
char temp=a[i];
a[i++]=a[j];
a[j]=temp;
j++;
}
}
for(int m=0;m<a.length;m++)
{System.out.print(a[m]);}
}
可以不改变顺序的一种方法(也是双指针只不过是倒叙双指针,前面是一正一反)
public static void solution3(String s)
{
int i=s.length()-1;
int j=s.length()-1;
int ans=0;
char[] a=s.toCharArray();
for(;i>=0;--i)
{
if(a[i]!='*')
{
char temp=a[i];
a[i]=a[j];
a[j--]=temp;
}
}
if(j>=0)
{
a[j]='*';
j--;
}
for(int m=0;m<a.length;m++)
{System.out.print(a[m]);}
}
也是两个指针在滑动的例子,第一个窗口要单独考虑进去。
public static void solution3(String s1,String s2){
int lena=s1.length();int lenb=s2.length();
char[] x1=s1.toCharArray();
char[] x2=s2.toCharArray();
if(lena<lenb)
System.out.print("no");;
int nonlen=0;
int[] num=new int[700000];
for(int i=0;i<lenb;i++)
{
if(++num[x2[i]-'a']==1)nonlen++;
}
for(int i=0;i<lenb;i++)
{
num[x1[i]-'a']--;
if(num[x1[i]-'a']==-1)nonlen++;
if(num[x1[i]-'a']==0)nonlen--;
if(nonlen==0)
System.out.print("yes");
}
for(int i=lenb;i<lena;++i)
{
int c=x1[i-lenb]-'a';
++num[c];
if(num[c]==1)nonlen++;
if(num[c]==0)nonlen--;
c=x1[i]-'a';
--num[c];
if(num[c]==-1)nonlen++;
if(num[c]==0)nonlen--;
if(nonlen==0)
System.out.print("yes");
}
}
如果不用split的话就扫一圈找到空格所在,之后在循环输出就行