【微软100题】定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。

package test;

/**
 * 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。

请实现字符串左旋转的函数。
 * 要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
 *
 * @author Zealot
 *
 */
public class MS_26 {
	private void rotateString(String s, int rotate) {
		System.out.println("翻转前的字符串"+s);
		char temp;
		char[] c = s.toCharArray();
		for(int i = 0, j = rotate - 1; i < j; i++, j--) {
			temp = c[i];
			c[i] = c[j];
			c[j] = temp;
		}
		for(int i = rotate, j=c.length - 1; i < j; i++,j--){
			temp = c[i];
			c[i] = c[j];
			c[j] = temp;
		}
		for(int i = 0, j=c.length - 1; i < j; i++,j--){
			temp = c[i];
			c[i] = c[j];
			c[j] = temp;
		}
		/*for(int i =0 ; i < c.length; i++) {
			System.out.print(c[i]);
		}*/
		System.out.println("翻转后的字符串"+String.valueOf(c));
	}

	public static void main(String[] args) {
		int rotate=2;
		String s = "abcdef";
		MS_26 ms26 = new MS_26();
		ms26.rotateString(s, rotate);

	}
}
时间: 2024-10-25 22:32:36

【微软100题】定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。的相关文章

微软100题系列之-----设计包含min函数的栈

题意: 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素. 要求函数min.push 以及pop 的时间复杂度都是O(1). 思路:定义两个栈,一个用来记录数据的插入和删除,一个用来存储最小值的变化 代码如下: template <class T> class Stack { public: Stack(int len=100); T Min(); T Pop(); void Push(T val); private: T top1,top2; T *stack1,*stack

【微软100题】一个台阶总共同拥有n 级,假设一次能够跳1 级,也能够跳2 级,求总共同拥有多少总跳法,并分析算法的时间复杂度

package ms100; /** * 一个台阶总共同拥有n 级,假设一次能够跳1 级.也能够跳2 级,求总共同拥有多少总跳法.并分析算法的时间复杂度 *注: 这道题近期常常出现.包含MicroStrategy 等比較重视算法的公司都曾先后选用过个这道题作为面试题或者笔试题. 首先我们考虑最简单的情况: 假设仅仅有1 级台阶,那显然仅仅有一种跳法. 假设有2 级台阶,那就有两种跳的方法了:一种是分两次跳.每次跳1 级:第二种就是一次跳2 级. 如今我们再来讨论普通情况: 我们把n 级台阶时的跳

【微软100题】输入一个整数,求该整数的二进制表达中有多少个1

package test; /** 整数的二进制表示中1的个数 题目:输入一个整数,求该整数的二进制表达中有多少个1. 例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析: 方法一:把十进制转换成二进制字符数组,遍历该数组,判断1的个数. 方法二:对于一个int n, n&1的结果就是n转化成二进制数后的最后一位的结果.考察了位运算 包括微软在内的很多公司都曾采用过这道题. * @author Zealot * */ public class MS_28 { private

微软100题第51题:和为n连续正数序列

题目:输入一个正数n,输出全部和为n连续正数序列.比如输入15,因为1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5.4-6和7-8. 方法一:记录序列长度.推断首项是否满足条件就可以 首先联想到的就是等差数列,并且方差为1的正数等差数列,我们仅仅须要记录一个序列长度,依据等差数列公式sum = na1+n(n-1)*d/2;我们能够得到na1 = sum - n(n-1)/2;仅仅需推断a1大于0就可以.当中n是我们记录的序列长度. 详细的程序例如以下: void co

微软面试100题系列算法心得

微软100题系列地址 答案地址 谓之随笔,当是自己在练习此类算法的一些想法,一些心得,一些领悟,一些借鉴,当自引用之时,会附上相应的链接! 题:把二元查找树转变成排序的双向链表(树) 描述:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 思维过程[个人思维]: 1. 二元查找树是指在任何结点看来,它的左子树上的值要少于当前结点的值,而它的右子树上的值要大于当前结点的值,对于等于的值那就看自己的原则放左子树还是右子树. 2. 关于树的算法必

python练习集100题(21-40)

题目21:两个乒乓球队进行比赛,各出3人.甲队为a,b,c三人,乙队为x,y,z三人.以抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x.z比,请编程找出三队比赛名单. first_list=['x','y','z'] for i in first_list:        #i是a的对手,j是b的对手,k是c的对手     for j in first_list:         if(j!=i):                        for k in fir

IT公司100题-26-左旋转字符串

问题描述: 给定字符串和左旋的字符数,写程序实现字符串的左旋操作.例如对于字符串”12345678″, 左旋转4个字符后,变成”56781234″.要求时间复杂度为O(n),空间复杂度O(1). 分析: 假设字符串表示为XY,X表示需要左旋的部分,左旋后字符串表示为YX. 根据公式: 代码实现: 1 // 26.cc 2 #include <iostream> 3 #include <string> 4 #include <cstring> 5 using namesp

微软算法100题88 将字符串中的字符&#39;*&#39;移到串的前部分

函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量.如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5.(要求使用尽量少的时间和辅助空间) 思路:类似于快速排序,用两个指针分别指向字符数组的左右边界,寻找左边第一个不为*的字符,寻找右边第一个*,然后交换字符,然后继续寻找和交换的过程,直到两个指针相交, 时间复杂度o(n), 空间复杂度o(1) 第一个写的程序有问题,没有考虑到保持

【C语言】请实现字符串循环右移函数。列如字符串“abcdefghi”向右移2位就是“hiabcdefg”

// 请实现字符串循环右移函数.列如字符串"abcdefghi"向右移2位就是"hiabcdefg" // 函数原型为:void RightLoopMove(char *pstr,unsigned short steps) #include <stdio.h> #include <assert.h> #include <string.h> void severse(char *p,char *q) //字符串翻转 { char t