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


    题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字啊的顺序不变。为简单起见,标点符号和普通字母一样处理。

    举例说明

    例如输入字符串”I am a student. ”,则输出”student. a am I”。

    解题思路

    第一步翻转句子中所有的字符。比如翻转“I am a student. ”中所有的字符得到”.tneduts a m a I”,此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。第二步再翻转每个单词中字符的顺序,就得到了”student. a am I”。这正是符合题目要求的输出。

    public class Test {
        public static void main(String[] args) {
            String str = "Student. a am I";
            System.out.println(reverseSentence(str));
        }
        public static String reverseSentence(String str) {
            if(str == null || str.length() <  1)
                return str;
            char[] chStr = str.toCharArray();
            reverse(chStr, 0, chStr.length - 1);
            
            int start = 0;
            int end = 0;
            while(start < chStr.length) {
                if(chStr[start] == ' ') {
                    start ++;
                    end ++;
                } else if( end == chStr.length || chStr[end] == ' ' ) {  // 此处或判断顺序不能改变
                    reverse(chStr, start, end-1);  // 调换每个单词的顺序
                    end ++;
                    start = end;
                } else {
                    end ++;
                }
            }
            return String.valueOf(chStr);
        }
        
        public static void reverse(char[] ch, int start, int end) {
            if(ch == null || ch.length < 1 || start > end || start < 0 || end > ch.length) {
                return;
            }
            
            while(start < end) {
                char temp = ch[start];
                ch[start] = ch[end];
                ch[end] = temp;
                start ++;
                end --;
            }
        }
    }

    题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。

    举例说明

    比如输入字符串”abcefg”和数字 2,该函数将返回左旋转 2 位得到的结”cdefab”。

    解题思路

    以”abcdefg”为例,我们可以把它分为两部分。由于想把它的前两个字符移到后面,我们就把前两个字符分到第一部分,把后面的所有字符都分到第二部分。我们先分别翻转这两部分,于是就得到”bagfedc”。接下来我们再翻转整个字符串, 得到的”cde 也 ab”同 lj 好就是把原始字符串左旋转 2 位的结果。

    public class Test {
        public static void main(String[] args) {
            String str = "adcdefgh";
            System.out.println(leftRotateString(str, 3));
        }
        
        public static String leftRotateString(String str,int n) {
            if(str == null || str.length() < 1 || n < 0) {
                return str;
            }
            char[] ch = str.toCharArray();
            
            reverse(ch, 0, n - 1);
            reverse(ch, n, ch.length - 1);
            reverse(ch, 0, ch.length - 1);
            
            return String.valueOf(ch); 
            
            
            
        }
        
        public static void reverse(char[] ch, int start, int end) {
            if(ch == null || ch.length < 1 || start > end || start < 0 || end > ch.length) {
                return;
            }
            
            while(start < end) {
                char temp = ch[start];
                ch[start] = ch[end];
                ch[end] = temp;
                start ++;
                end --;
            }
        }
    }
  • 相关阅读:
    第一次冲刺个人博客03
    第一次冲刺个人博客02
    《梦断代码》阅读笔记01
    “进度条”博客——第十一周
    “进度条”博客——第十周
    “进度条”博客——第九周
    站立会议个人博客10(2016/4/28)
    站立会议个人博客9(2016/4/27)
    站立会议个人博客8(2016/4/26)
    站立会议个人博客7(2016/4/25)
  • 原文地址:https://www.cnblogs.com/zywu/p/5799389.html
Copyright © 2020-2023  润新知