题目

  给定一个字符类型的数组chas,请在单词间做逆序调整。只要做到单词顺序逆序即可,对空格的位置没有特别要求

  举例,如果把chas看作字符串为"dog loves pig",调整成"pig loves dog";如果把chas看作字符串为"I'm a student.",调整成"student. a I'm"

要求

  如果chas长度为N,要求时间复杂度为O(N),空间复杂度为O(1)

分析

  首先将整个单词序列逆序,逆序后再将每个单词逆序,即可将单词顺序逆序。如"dog loves pig",首先将整个单词序列逆序得到"gip sevol god",然后将每个单词逆序,得到"pig loves dog"。整个过程都实在元字符数组的基础上完成的,所以空间复杂的为O(1),全程总共只遍历了整个字符数组两次,所以时间复杂度为O(N)  

 1 public void rotateWord(char[] chas)
 2 {
 3     if(chas == null || chas.length == 0)
 4     {
 5         return;
 6     }
 7
 8     reverse(chas, 0, chas.length -1);      // 先将整个单词序列逆序
 9     int left = -1;         // left跟踪单词的左边界
10     int right = -1;        // right跟踪单词的右边界
11     for(int i = 0; i < chas.length; i++)
12     {
13       if(chas[i] != ' ')
14       {
15           left = i == 0 || chas[i-1] == ' ' ? i : left;
16           right = i == chas.length || chas[i+1] == ' ' ? i : right;
17       }
18       if(left != -1 && right != -1)
19       {
20           reverse(chas, left, right);        // 然后将单个单词逆序
21           left = -1;
22           right = -1;
23       }
24
25     }
26 }
27
28
29 public void reverse(char[] chas, int start, int end)
30 {
31     char temp;
32
33     while(start < end)
34     {
35       temp = chas[start];
36       chas[start] = chas[end];
37       chas[end] = temp;
38       start++;
39         end--;
40     }
41 }
42
43     

题目

  给定一个字符类型的数组chas和一个整数size,请把大小为size的左半区整体移到右半区,右半区整体移到左边

  举例,如果把chas看作字符串为"ABCDE",size=3,调整成"DEABC"

要求

  如果chas长度为N,要求时间复杂度为O(N),空间复杂度为O(1)

分析

  可以先将字符数组整体翻转,然后将长度为chas.length-size的左半区和长度为size的右半区分别翻转。或者先将长度为size的左半区逆序,然后将长度为chas.length-size的右半区逆序,最后整体逆序

方法一:

 1 public void rotate(char[] chas, int size)
 2 {
 3     if(chas == null || chas.length == 0)
 4     {
 5       return;
 6     }
 7     reverse(chas, 0, chas.length-1);           // 先整体逆序
 8     reverse(chas, 0, chas.length-size-1);     // 将翻转后得到的数组中长度为chas.length-size的左半区逆序
 9     reverse(chas, chas.length-size, chas.length-1);  // 长度为size的右半区逆序
10 }
11
12 public void rotate(char[] chas, int size)
13 {
14     if(chas == null || chas.length == 0)
15     {
16       return;
17     }
18
19     reverse(chas, 0, size-1);             // 将长度为size的左半区逆序
20     reverse(chas, size, arr.length-1);  // 长度为arr.length-size的右半区逆序
21     reverse(chas, 0, arr.length-1);     // 整体逆序
22 }

方法二:

 1 public void rotate(char[] chas, int size)
 2 {
 3    if(chas == null || chas.length < size)
 4     {
 5         return;
 6     }
 7
 8     int start = 0;
 9     int end = chas.length - 1;
10     int lpart = size;
11     int rpart = chas.length - size;
12     int m = Math.min(lpart, rpart);
13     int d = lpart - rpart;
14     while(true)
15     {
16         exchange(chas, start, end, m);
17         if(d == 0)
18         {
19             break;
20         }
21         else if(d > 0)
22         {
23             start += m;
24             lpart = d;
25         }
26         else
27         {
28             end -= m;
29             rpart = -d;
30         }
31         m = Math.min(lpart, rpart);
32         d = lpart - rpart;
33     }
34 }
35
36 public void exchange(char[] chas, int start, int end, int size)
37 {
38     end = end - size + 1;
39     char temp = 0;
40     while(size-- != 0)
41     {
42         temp = chas[start];
43         chas[start] = chas[end];
44         chas[end] = temp;
45         start++;
46         end++;
47     }
48 }

来源:左程云老师《程序员代码面试指南》

转载于:https://www.cnblogs.com/latup/p/10886242.html

Coding Interview Guide -- 翻转字符串相关推荐

  1. Coding Interview Guide -- 括号字符串的有效性和最长有效长度

    [题目] 给定一个字符串str,判断是不是整体有效的括号字符串 举例,str = "()",返回true:str = "(()())",返回true:str = ...

  2. Coding Interview Guide -- 数组的partition调整

    [题目] 给定一个有序数组arr,调整arr使得这个数组的左半部分没有重复元素且升序,而不用保证右部分是否有序 例如,arr=[1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, ...

  3. Coding Interview Guide -- 向有序的环形单链表中插入新节点

    [题目] 一个环形单链表从头节点head开始不降序,同时由最后的节点指回头节点.给定这样一个环形单链表的头节点head和一个整数num,请生成节点值为num的新节点,并插入到这个环形链表中,保证调整后 ...

  4. 渣基础:比照Hawstein学Cracking the coding interview(1)

    <C++ Primer 第五版>书实在是太长,太厚了.总是看了十几页就看累了,坚持不了多久,想了想还是别勉强自己,决定把它当工具书查看,或者积累足够的C++经验后再翻阅一遍. 目前的打算是 ...

  5. [译]1-Key-Value Coding Programming Guide 官方文档第一部分

    Key-Value Coding Programming Guide 官方文档第一部分 2018.9.20 第一次修正 iOS-KVC官方文档第一部分 Key-Value Coding Program ...

  6. python单词反转_翻转字符串里的单词

    翻转字符串里的单词 题目要求 给定一个字符串,逐个翻转字符串中的每个单 示例: 输入: " the sky is blue", 输出: "blue is sky the ...

  7. python反转字符串_python翻转字符串

    Python 列表截取可以接收第三个参数,参数作用是截取的步长,以下实例在索引 1 到索引 4 的位置并设置为步长为 2(间隔一个位置)来截取字符串: 如果第三个参数为负数表示逆向读取. 以下实例用于 ...

  8. 算法--------翻转字符串里的单词(Java版本)

    题目: 给定一个字符串,逐个翻转字符串中的每个单词.示例 1:输入: "the sky is blue" 输出: "blue is sky the" 示例 2: ...

  9. python coding style guide 的快速落地实践——业内python 编码风格就pep8和谷歌可以认作标准...

    python coding style guide 的快速落地实践 机器和人各有所长,如coding style检查这种可自动化的工作理应交给机器去完成,故发此文帮助你在几分钟内实现coding st ...

最新文章

  1. Leangoo看板Jenkins配置指南
  2. SQL实现分组查询取前几条记录
  3. 量子位「MEET 2022智能未来大会」启动,邀你一起见证AI价值
  4. 计算机一级挂科率,[转]计算机一级难吗?看了它想挂科,难难难难把此(精)
  5. 依赖注入[2]: 基于IoC的设计模式
  6. (2)ZYNQ FPGA加载比特流(FPGA不积跬步101)
  7. 稀疏矩阵转置 java代码_三元组稀疏矩阵的快速转置
  8. (zt)ACE中的Proactor介绍和应用实例
  9. 鼠标悬停显示图片html5,JavaScript 鼠标悬停图片,显示隐藏文本
  10. catalina配置参数
  11. socket.io 消息发送
  12. php中mbsubstr汉字,php中文字符串截取(mb_substr)实例
  13. The7 — 响应式多用途 WordPress 主题 免费下载
  14. 黑客攻击-木马程序(3)
  15. RoaringBitmap位图数据结构及源码分析
  16. Java selenium 爬取 星图
  17. 成功解决numpy.ndarray size changed
  18. 文华学院计算机专业师资,华中科技大学文华学院“最受欢迎教师”名单
  19. neogeo模拟器 linux,neogeo模拟器
  20. mysql弱类型_PHP弱类型及相关函数Bypass

热门文章

  1. python configparser 空格_python的ConfigParser模块
  2. phpexcel删除行_php - PHPExcel从大型工作表中删除行 - 堆栈内存溢出
  3. SQLi LABS Less 10 时间盲注
  4. 卷积神经网络(CNN)相关的基础知识
  5. VUE实现Tab切换
  6. 整理 .NET 平台下一些强大的开源控件和类库
  7. 逻辑斯蒂回归与最大熵模型---最大熵模型
  8. cocos2d-x学习笔记番外篇05:如何快速屏蔽触摸
  9. WPF通用窗体模板【2】
  10. js拾遗: replace 替换参数