首页 > 试题广场 >

字符串的旋转

[编程题]字符串的旋转
  • 热度指数:46861 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。

给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。

测试样例:
"ABCDEFGH",8,4
返回:"FGHABCDE"
剑指offer上面的题目,两次reverse
第一次两部分分别reverse
第二次整体reverse。
    string rotateString(string A, int n, int p) {
        // write code here
        //剑指offer上的题目,两次翻转
        
        //先进行局部翻转
        int i = 0, j = p;
        while(i < j)
            swap(A[i++], A[j--]);
        
		i = p + 1, j = n - 1; 
        while(i < j)
            swap(A[i++], A[j--]); 
        
        //再整体翻转
        i= 0, j = n - 1;
        while(i < j)
            swap(A[i++], A[j--]);
        
        return A;
        
    }
如果调用reverse函数,看起来更简单。。。
    string rotateString(string A, int n, int p) {
        // write code here
        //剑指offer上的题目,两次翻转
        
        //先进行局部翻转
        reverse(A.begin(), A.begin()+p+1); //vector的迭代器支持 + 
        reverse(A.begin()+p+1, A.end());
        //再整体翻转
        reverse(A.begin(), A.end());
        
        return A;
        
    }

发表于 2017-04-13 14:21:59 回复(2)
 string B=A;
        int i,j=p;
        for (i=0;i<n;i++)
            {
            j=(j+1)%n;
            B[i]=A[j];
        }
        return B;

发表于 2016-09-18 19:47:55 回复(0)
class StringRotation {
public:
    string rotateString(string A, int n, int p) {
        // write code here
        string B = A + A;
        string C = A;
        for(int i = 0; i < n; i++){
            C[i] = B[p + i + 1];
        }
        return  C;
    }
};
不太会调用库函数,代码看起来比较繁琐。

发表于 2016-03-07 16:32:17 回复(1)

一行代码就可以搞定!!!

public class StringRotation {      
   public String rotateString(String A, int n, int p) {
        return A.substring(p+1,n) + A.substring(0, p+1);
   } 
}
编辑于 2018-03-30 13:38:37 回复(0)
return A.substring(p+1,n)+A.substring(0, p+1);

发表于 2018-02-27 15:35:43 回复(0)
import java.util.*;
//两次分别翻转,再整体翻转。前面都说了很多了,就不赘述了,仅来签到而已
public class StringRotation {
    public String rotateString(String str, int n, int p) {
        
        String strA = str.substring(0,p+1);
        String strB = str.substring(p+1,n);
        
        StringBuilder sbA = new StringBuilder(strA);
        StringBuilder sbB = new StringBuilder(strB);
        
        strA = sbA.reverse().toString();
        strB = sbB.reverse().toString();
        
        StringBuilder sb = new StringBuilder(strA+strB);
        String res = sb.reverse().toString();
        
        return res;
    }
}
编辑于 2017-08-03 11:14:05 回复(0)
classStringRotation {
public:
    string rotateString(string A, intn, intp) {
        // write code here
        return(A+A).substr(p+1,n);
    }
};

发表于 2017-01-15 16:53:39 回复(0)
import java.util.*;
public class StringRotation {
   public String rotateString(String A, int n, int p) {
		return A.substring(p + 1) + A.substring(0, p + 1);
	}
}

发表于 2016-10-18 09:28:29 回复(0)
StringBuilder  sb1=new StringBuilder();
    	StringBuilder  sb2=new StringBuilder();
    	for(int i=0;i<n;i++){	
    		if(i<p+1)
    		sb1.append(A.charAt(i));
    		else{
    			sb2.append(A.charAt(i));
    		}
    	}
    	return sb2.toString()+sb1.toString();

发表于 2016-03-28 16:22:28 回复(1)
private void rotate(char[] str, int start, int end) {
		if (str == null || start < 0 || end > str.length - 1)
			return;
		while (start < end) {
			char temp = str[start];
			str[start++] = str[end];
			str[end--] = temp;
		}
	}

	public String rotateString(String A, int n, int p) {
		// write code here
		char[] x = A.toCharArray();
		rotate(x, 0, p);
		rotate(x, p + 1, n - 1);
		rotate(x, 0, n - 1);
		return new String(x);
	}

发表于 2016-03-20 23:46:00 回复(3)
class StringRotation {
public:
    string rotateString(string A, int n, int p) {
        string B;
        B+=A.substr(p+1,n-p);
        B+=A.substr(0,p+1);
        return B;
    }
};
主要考察substr()函数的用法,A.substr(p,n)表示截取字符串A从位置p开始后的n个字符。
发表于 2019-03-05 20:47:53 回复(0)
哪位大佬,能不能帮我写一个这个题完整的c++代码,不是这里头文件什么都没有,对于我这c++小白不容易理解,谢谢
发表于 2018-10-24 09:36:50 回复(0)
import java.util.*;

public class StringRotation {
    public String rotateString(String A, int n, int p) {
        return A.substring(p+1)+A.substring(0,p+1);
    }
} 

发表于 2018-10-17 14:28:05 回复(0)

性能最优:
return new StringBuilder(A).append(A).toString().substring(p + 1,n + p +1);
时间20ms,空间9964k
如果使用
return (A + A).substring(p + 1 ,n + p + 1);
时间为50ms,空间9688k
编辑于 2018-03-29 17:01:54 回复(0)
class StringRotation {
public:
    string rotateString(string A, int n, int p) {
        // write code here
        reverse(A.begin(),A.begin()+p+1);
        reverse(A.begin()+p+1,A.end());
        reverse(A.begin(),A.end());
        return A;
    }
};

发表于 2018-01-18 14:10:38 回复(0)
class StringRotation {
public:
    string rotateString(string A, int n, int p) {
        return A.substr(p+1,n) + A.substr(0,p+1);
    }
};

发表于 2017-10-20 00:58:03 回复(0)
解法各种各样,但是面试的时候面试官期待的答案应该是先把每一部分进行旋转,然后再整体旋转
发表于 2017-08-21 11:04:03 回复(0)
class StringRotation {
public:
    string rotateString(string A, int n, int p) {
        string B;
        for(int i=p+1;i<n;i++)  B+=A[i];
        for(int j=0;j<=p;j++)   B+=A[j];     
        return B;
    }
};

发表于 2017-04-23 20:37:49 回复(0)
import java.util.*;

public class StringRotation {
    public String rotateString(String A, int n, int p) {
        // write code here
        if(A==null||n<=0||p>=n)
            return null;
        String tmp=A+A;
char[] c=tmp.toCharArray();
char[] newChar=new char[n];
for(int i=0,j=p+1;i<n;i++,j++)
{
newChar[i]=c[j];
}
return String.valueOf(newChar);
    }
}
发表于 2017-03-06 10:22:51 回复(0)
很简单的题目,主要是思路
稍好一点的方法是拼接两个字符串,从中间截取源字符串长度,就得到了旋转字符串

    string rotateString(string A, int n, int p) {
        string s = A+A;
        return s.substr(p+1,n);
    }

发表于 2016-08-28 20:34:23 回复(0)