【Java】 剑指offer(58-1) 翻转单词顺序

 

本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目

  输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。

思路

  一开始自己觉得要用split()方法,但这要开辟新的数组,占内存空间,不行。

  首先实现翻转整个句子:只需要在首尾两端各放置一个指针,交换指针所指的数字,两端指针往中间移动即可。之后根据空格的位置,对每个单词使用同样的方法翻转即可。

测试算例 

  1.功能测试(句子中有一个/多个单词,空格在开头、中间、结尾)

  2.边界值测试(null,空字符串,句子全为空格)

Java代码

注:本题的隐含条件就是不能用额外的空间;因此下面的代码中,输入参数应该是char[] ,而不是String。这里用的是牛客网上自己写的代码,就没改了。

//题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
//为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",
//则输出"student. a am I"。

public class ReverseWordsInSentence {
    public String ReverseSentence(String str) {
        if(str==null || str.length()<=0)
            return str;
        char[] chars = str.toCharArray();
        //翻转整个句子
        reverseSb(chars,0,chars.length-1);
        //翻转单词(指针指向单词的第一个和最后一个)
        int start=0;
        int end=0;
        while(start<chars.length){
            while(end<chars.length && chars[end]!=‘ ‘)
                end++;
            reverseSb(chars,start,end-1);
            start=++end;
        }
        /*翻转单词的另一种写法(指针指向blank位置)
        int blank = -1;
        for(int i = 0;i < chars.length;i++){
            if(chars[i] == ‘ ‘){
                int nextBlank = i;
                reverse(chars,blank + 1,nextBlank - 1);
                blank = nextBlank;
            }
        }
        */
        return String.valueOf(chars);
    }

    private void reverseSb(char[] chars,int start,int end){
        while(start<end){
            char temp=chars[start];
            chars[start]=chars[end];
            chars[end]=temp;
            start++;
            end--;
        }
    }
}

  

收获

  1.翻转字符串方法get√

  

更多:《剑指Offer》Java实现合集  

原文地址:https://www.cnblogs.com/yongh/p/9963135.html

时间: 2024-11-08 20:19:14

【Java】 剑指offer(58-1) 翻转单词顺序的相关文章

剑指offer之【翻转单词顺序列】

题目: 翻转单词顺序列 链接: https://www.nowcoder.com/practice/3194a4f4cf814f63919d0790578d51f3?tpId=13&tqId=11197&rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴

剑指offer系列47---翻转单词顺序

[题目]“I am a student.”>>>“.tneduts a ma I”.>>student. a am I 1 package com.exe9.offer; 2 3 /** 4 * [题目]“I am a student.”>>>“.tneduts a ma I”.>>student. a am I 5 * @author WGS 6 * 7 */ 8 public class ReverseWordsInSentence { 9

剑指Offer对答如流系列 - 翻转字符串

面试题58:翻转字符串 问题描述 问题(1) 翻转单词顺序 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理. 例如输入字符串"I am a student. ",则输出"student. a am I". 问题(2)左旋转字符串 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能. 比如输入字符串"abcdefg"和数字2,该函数将返回左

剑指Offer 58

翻转单词顺序列: 1 # -*- coding:utf-8 -*- 2 class Solution: 3 def ReverseSentence(self, s): 4 ary = s.split(' ') 5 for i in range(len(ary[::-1])): 6 ary[i] = ary[i][::-1] 7 print(ary[i]) 8 return " ".join(ary)[::-1] 9 # write code here 左旋转字符串: 1 # -*- c

《剑指offer》:[42]翻转英文中单词顺序

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理. 对字符串的操作,主要问题:一定要注意字符串为NULL和访问越界的情况!再就是找'\0'. 例如输入字符串:"I love you.",经过翻转就变成:"you. love I".看出来了吗,故意的,(不论语法)呵呵! 方案一:两次翻转法.两次翻转法就是先对整个字符串进行翻转:".uoy evol I":第二次再翻转对句子中的单个单词进行

剑指offer 58.对称的二叉树

58.对称的二叉树 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 }; 10 */ 11 class Solution { 1

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

题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 解法一:O(n^2) 从头扫描数组,每碰到一个偶数,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位.挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位中. 由于每碰到一个偶数就需要移动O(n)个数字,因此总的时间复杂度是O(n^2). 解法二:O(n) 类似快排,两个指针,一个指向数组头,只向后移动,一个指向数组尾,只向前移动.如果第一个指针指向的数字是偶

剑指offer 调整奇偶数的顺序 转换为调整所有逆序的问题

class Solution { public: void reOrderArray(vector<int> &array) { if(array.empty() || array.size() == 1){ return; } auto end = (int)array.size(); int i = 0; while(i < end){ auto a = array; if( array[i] % 2 == 0 && array[i+1] % 2 == 1){

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

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 法一: public class Solution { public void reOrderArray(int [] array) { int oddCnt=0; for(int val : array){ if((val & 0x1) == 1) oddCnt++; } int[] copy = array.clone();

剑指offer:按之字形顺序打印二叉树

题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: """ 由于需要打印Z字型,那么我们在遍历整棵树的时候就需要维护一个栈. 栈中存储的是下一层的节点的逆序,则在访问的时候