IT企业面试题(java描述)-字符串旋转(旋转字母或者单词)

这一章节我们来讨论一下IT企业面试题:字符串旋转(旋转字母或者单词)。

题目:

将字符串"abcdef"旋转成“defabc”

或者

将字符串"i am a student."旋转成"student. a am i"

而且在上面的题目里面还会加上不能够使用库函数的限制,我们下面将讨论解题的思路以及具体的代码。

1.思路

(1)暴力解法

就是一个字符一个字符的往后扔

(2)分部法

将不旋转部分和旋转部分分开来处理,先各自反转,再整体反转

(3)使用stack特性来处理

对于第一个题目我们可以使用第一第二种思路来处理,而第三种思路是在全部反转的时候更加出彩(如果是某几个旋转,第三种思路就会出现很多麻烦的处理,在这里不推荐使用)

2.具体代码

(1)下面的代码解题:将字符串"abcdef"旋转成“defabc”

package com.ray.datastructure.ch01.topic_1_1;

public class ReverseString_1 {

	private static String FirstCharToEnd(String source) {
		char[] charArray = source.toCharArray();
		char firstLetter = charArray[0];
		for (int i = 1; i < source.length(); i++) {
			charArray[i - 1] = charArray[i];
		}
		charArray[charArray.length - 1] = firstLetter;
		return new String(charArray);
	}

	public static String someCharsToEnd(String source, int countOfChar) {
		for (int i = 0; i < countOfChar; i++) {
			source = FirstCharToEnd(source);
		}
		return source;
	}

	public static void main(String[] args) {
		String source = "abcdef";
		System.out.println(someCharsToEnd(source, 3));
	}
}

测试输出:

defabc

上面是暴力解法,一个一个字符往后扔,因此造成时间复杂度是O(m*n)相对来说性能较差,当然,如果在笔试比较紧张的前提下,这个也算一个答案

(2)下面的代码解题:将字符串"abcdef"旋转成“defabc”

package com.ray.datastructure.ch01.topic_1_1;

public class ReverseString_2 {

	private static String reverse(String source, int start, int end) {
		char[] charArray = source.toCharArray();
		while (start < end) {
			char temp = charArray[start];
			charArray[start++] = charArray[end];
			charArray[end--] = temp;
		}
		return new String(charArray);
	}

	public static String reverse(String source, int pos) {
		if (pos > source.length()) {
			return "error:post is bigger than source‘s length";
		}
		source = reverse(source, 0, pos - 1);
		source = reverse(source, pos, source.length() - 1);
		source = reverse(source, 0, source.length() - 1);
		return source;
	}

	public static void main(String[] args) {
		String source = "abcdef";
		System.out.println(reverse(source, 3));
	}
}

测试输出:

defabc

上面的代码使用了分部法,首先把字符串看成两部分,一部分是需要移动的部分,就是上面的“abc”,另一部分是不需要移动的部分“def”,第二是把这两部分各自反转,变成“cba””fed“,现在返回的字符串是”cbafed“,第三是把”cbafed“这一个字符串整个反转,就变成了“defabc”了,这样的算法,时间复杂度变成了O(n)

(3)下面的代码解题:将字符串"i am a student."旋转成"student. a am i"

根据题目所给出的例子,我们这里应该是单词的调换,因此,就不再像上面的每一个字符的旋转

package com.ray.datastructure.ch01.topic_1_1;

public class ReverseString_3 {

	public static String reverse(String source, String regex, int start, int end) {
		String[] strArray = source.split(regex);
		while (start < end) {
			String temp = strArray[start];
			strArray[start++] = strArray[end];
			strArray[end--] = temp;
		}
		String rtnStr = "";
		for (int i = 0; i < strArray.length; i++) {
			rtnStr += strArray[i] + regex;
		}
		return rtnStr.trim();
	}

	public static void main(String[] args) {
		String source = "i am a student.";// student. a am i
		String regex = " ";
		System.out.println(reverse(source, regex, 0, source.split(regex).length - 1));
	}
}

测试输出:

student. a am i

从通用性来说,上面的这种方式比较好,因为它可以自定义调换的单词,暂时来说是最优实现

(4)下面的代码解题:将字符串"i am a student."旋转成"student. a am i"

对于这一题,我们如果允许使用库函数,可以引入栈的特性

package com.ray.datastructure.ch01.topic_1_1;

import java.util.Stack;

public class ReverseString_4 {

	public static String reverse(String source, String regex) {
		String[] strArray = source.split(regex);
		Stack<String> stack = new Stack<String>();
		for (String item : strArray) {
			stack.push(item);
		}
		String rtnStr = "";
		while (!stack.isEmpty()) {
			rtnStr += stack.pop() + regex;
		}
		return rtnStr.trim();
	}

	public static void main(String[] args) {
		String source = "i am a student.";// student. a am i
		String regex = " ";
		System.out.println(reverse(source, regex));
	}
}

测试输出:

student. a am i

上面的代码利用栈的先进后出的特性来实现题目

但是这里有局限性,它只是在全部旋转的前提下才好使,如果像上面的那种局部也可以调转的情况,就不推荐使用。

总结:这一章节注意结束了字符串反转(旋转字母或者单词)的几种方法。

时间: 2024-10-08 20:49:55

IT企业面试题(java描述)-字符串旋转(旋转字母或者单词)的相关文章

ACM试题 - 括号配对问题 - Java中字符串截取和定位问题

ACM试题题源(括号配对问题):http://acm.nyist.net/JudgeOnline/problem.php?pid=2 提交代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n = cin.nextInt(); String[] ans = new String[n];

数组,链表,字符串 的旋转(未完待续)

字符串操作 题目一: 字符串的旋转(左旋操作) 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdefab”.请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1). 题目出处:程序员编程艺术:面试和算法心得 微软面试100题 第二十六题 剑指Offer 第42题,翻转字符串vs 左旋转字符串 分析: 解法一:暴力法————循环移位,时间

2017年最新企业面试题之shell(一)

2017年最新企业面试题之shell(一) ********************************************** 企业Shell面试题1:批量生成随机字符文件名案例 * ********************************************** 使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,名称示例如下: [[email protected] C19]# ls /oldbo

Java基础——字符串正则及Scanner

1.正则表达式 1.1.基础 字符串处理问题一般集中在匹配.选择.编辑于验证上,而正则表达式提供了一种完全通用的方式来解决这些问题 正则表达式就是以某种模式描述字符串,因此你可以说:“如果一个字符串含有这些东西,那么它就是我要找的东西”.例如我们可以用一下模式匹配数字:(-|\\+)?\\d+,他可以匹配任意整数. 测试如下: public class IntegerMatch { public static void main(String[] args) { System. out.prin

[笔记]一道C语言面试题:IPv4字符串转为UInt整数

题目:输入一个IPv4字符串,如“1.2.3.4”,输出对应的无符号整数,如本例输出为 0x01020304. 来源:某500强企业面试题目 思路:从尾部扫描到头部,一旦发现无法转换,立即返回,减少无谓操作. #include "stdio.h" #include "stdlib.h" #include "string.h" bool ConvertIPv4ToUInt(const char *strIP, unsigned int *ip) {

华为历年试题(9字符串计算器)

问题描述: 在软件园开饭店的小明最近很郁闷,经常在进行账目核查时出错,每次的计算结果总是有偏差.小王知道后打算为小明解决这个问题,经过调查发现,问题出现在计算器上,当前的计算器计算方法大部分是:输入数据,输入运算符,再输入数据,立刻给出计算结果,然后不断循环.当计算结束时,如果出现偏差或者数据,无法回顾查看到底是哪一步出错,如果需要再次核查,还需要再全部输入一次,非常耽误时间.小王打算帮老板设计一种新的计算器,能够支持表达式的计算,由于是第一个版本,只需要支持整数的“+,-,*”和“( )”即可

去哪儿2015笔试题:寻找字符串的差异

去哪儿的一道笔试题. 给定两个字符串a,b:找出两个字符串中不一样的字符串.如存在于a而不存在于b,则将该字符输出,同时.加一个"-"标记:若存在于b而不存在于a,则输出该字符,同时以"+"标记.若是同时存在于a.b中,则不输出.假设字符串是由字母组成. 如: a="abc",b="aabcbc",则输出为"+a,+b,+c": a="abcde",b="bcdef"

(转)2017年最新企业面试题之shell(一,二)

2017年最新企业面试题之shell(一) ********************************************** 企业Shell面试题1:批量生成随机字符文件名案例 * ********************************************** 使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,名称示例如下: 1 2 3 4 5 [[email protected] C19]#

Linux运维必会的MySQL企业面试题大全 推荐

Linux运维必会的MySQL企业面试题大全 推荐 (1)基础笔试命令考察 1.开启MySQL服务 /etc/init.d/mysqld startservice mysqld startsystemctl  start mysqld 2.检测端口是否运行 lsof -i :3306netstat -lntup |grep 3306 3.为MySQL设置密码或者修改密码 设置密码 mysql -uroot -ppassword -e "set passowrd for root = passow