剑指Offer——反转单词顺序(Java)

问题描述:输入一个英文句子,反转句子中的单词的顺序,但单词内字符的顺序不变;(为简单起见,标点符号与普通字符当做一样处理)

示例       :输入:“I am a student.”

输出: “.student a am I”

策略      :策略是先反转整个字符串,在根据空格划分单词,然后依次反转每个单词

代码      :

public class ReverseString {

	/*****反转单个字符串函数****/
	public char[] reverseStr(char[] StrArr, int start, int end)
	{
		if (StrArr == null)
			return null;

		while(start < end)
		{
			char temp = StrArr[start];
			StrArr[start ++] = StrArr[end];
			StrArr[end --]   = temp;
		}

		return StrArr;
	}

	/** 根据单词进行反转
	 *  策略是先反转整个字符串,在根据空格划分单词,然后依次反转每个单词*/
	public String reverseAll(String dataStr)
	{
		if(dataStr == null || dataStr.length() == 0)
			return dataStr;

		char[] dataArr = dataStr.toCharArray();

		//反转整个字符串
		int start = 0;
		int end = dataStr.length() - 1;

		reverseStr(dataArr, start, end);

		//类似于双指针法,根据空格划分单词
		start = end = 0;

		while(start < dataStr.length())
		{
			//如果start为空格,则跳过它不把它识别为单词的一部分
			if(dataArr[start] == ' ')
			{
				start ++;
				end ++;
			}
			//当end指针移到字符串数组末尾,或者当前为空格,则start指针到end指针之间构成一个单词
			else if(end == dataStr.length() || dataArr[end] == ' ')
			{
				//注意end已经对应单词末尾后面一位,要注意先自减
				reverseStr(dataArr, start, --end);
				//开始识别下一个单词
				start = ++ end;
			}
			else
			{
				//此为一般情况,end指针一直后移
				end++;
			}
		}

		return new String(dataArr);

	}

	public static void main(String[] args)
	{
		String Str = " I   am  The     Hello!";
		System.out.println(new String(new ReverseString().reverseAll(Str)));
	}

}
时间: 2024-12-28 14:54:06

剑指Offer——反转单词顺序(Java)的相关文章

剑指Offer41 反转单词顺序,单词字符顺序不变

1 /************************************************************************* 2 > File Name: 41_ReverseWords.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月04日 星期日 16时18分34秒 6 **************************************

剑指offer (42) 单词翻转

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符顺序不变 题解分析: 两次翻转: 第一次翻转整个句子 第二次解析出每个单词并将单词翻转 void reverse(char* first, char* last) { assert(first != NULL && last != NULL); while (first < last) { char temp = *first; *first = *last; *last = temp; ++first; --last; }

剑指Offer——翻转单词顺序列

题目描述: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 分析: 同上一题的解法.剑指Offer--左旋转字符串. 代码: 1 class Solut

剑指offer---翻转单词顺序

题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? class Solution { public: void fanzhuandanci(str

剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面

题目:输入一个整数数组.实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位于数组的后半部分. 1.基本实现: 假设不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的全部的数字往前面挪动一位. 挪完之后在数组的末尾有一个空位.这时把该偶数放入这个空位. 因为没碰到一个偶数就须要移动O(n)个数字.因此总的时间复杂度是O(n2).可是,这样的方法不能让面试官惬意.只是假设我们在听到题目之后立就可以以说出这个解法,

剑指Offer编程题(Java实现)——反转链表

题目描述 输入一个链表,反转链表后,输出新链表的表头. 思路一 使用头插法迭代进行反转 实现 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode ReverseList(ListNode head) { ListNode newHead = new ListNode(-1

[剑指offer] 字符串的顺序全排列

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 结果请按字母顺序输出. 输入描述 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 输出描述 顺序输出字符串的所有排列 题目分析 这是一个字符串全排列的问题,把全部序列存在TreeSet中默认可得到字典顺序. TreeSet 基于TreeMap实现的SortedSet,可以对Set集合中的元

剑指offer-翻转单词顺序VS左旋转字符串

题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字啊的顺序不变.为简单起见,标点符号和普通字母一样处理. 举例说明 例如输入字符串”I am a student. ”,则输出”student. a am I”. 解题思路 第一步翻转句子中所有的字符.比如翻转“I am a student. ”中所有的字符得到”.tneduts a m a I”,此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了.第二步再翻转每个单词中字符的顺序,就得到了”student. a am I”.这正

剑指offer——调整数组顺序使奇数位于偶数前面

题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 看代码: public class Solution { public static void reOrderArray(int[] arr) { int i,j,target; for (i = 1 ; i< arr.length; i++) { target = arr[i]; if (target%2!=0)