• 手摇算法与字符串旋转


    手摇法指通过三次reverse操作,实现数组的rotation:

    1.如何实现字符串倒置

    /**
    	 * 反转倒置
    	 * 在由char[]转为Sting注意不要使用toSting方法
    	 */
    	public static void reverse(char[] chr){
    		int n=chr.length-1;
    		//使用头尾两个指针从两边向中间扫,并且不断交换两个指针的内容
    		for(int i=0;i<chr.length/2;i++){
    			swap(chr,i,n--);
    		}
    	}
    

      

    2.字符串旋转和手摇算法

    《编程珠玑》里的一个题目:
    请将一个具有n个元素的一维向量x向左旋转i个位置。例如,假设n=8,i=3,
    那么向量abcdefgh旋转之后得到向量defghabc。

    /**
    	 * 用于反转字符数组中index1~index2位置的这一段
    	 * 左闭右开区间,index1<=下标<index2
    	 */
    	public static void reverse(char[] chr,int index1,int index2){
    		if(index2-index1 < 2) 
    			return; 
    		int j=index2-1;//右侧下标
    		for(int i=index1;i<(index2+index1)/2;i++){
    			swap(chr,i,j--);
    		}
    	}
    	
    	/**
    	 * 旋转
    	 * 使用三次反转,实现旋转
    	 * 数组注意区间取值
    	 * @param m 从位置m处进行旋转
    	 */
    	public static void rotation(char[] chr,int m){
    		//第一次倒置0~m位置
    		reverse(chr,0,m);
    		//第二次倒置m~最后位置
    		reverse(chr,m,chr.length);
    		//最后整体倒置
    		reverse(chr,0,chr.length);
    	}
    	
    	private static void swap(char[] arr,int index1,int index2){
    		char temp=arr[index1];
    		arr[index1]=arr[index2];
    		arr[index2]=temp;
    	}

    手摇算法还可以用来优化归并排序,实现不需要额外空间开销的原地归并,即将空间复杂度降为O(1)

  • 相关阅读:
    Q739.每日温度
    面试题46. 把数字成字符串
    [990. 等式方程的可满足性]--并查集
    [128. 最长连续序列]
    javaweb实现简单登陆功能
    7.12_python_lx_practise
    7.12_python_lx_day6
    7.12_python_lx_day5
    7.2_python_lx_day4
    7.2_python_lx_day3
  • 原文地址:https://www.cnblogs.com/binyue/p/5194462.html
Copyright © 2020-2023  润新知