Coding Interview Guide -- 翻转字符串
【题目】
给定一个字符类型的数组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 -- 翻转字符串相关推荐
- Coding Interview Guide -- 括号字符串的有效性和最长有效长度
[题目] 给定一个字符串str,判断是不是整体有效的括号字符串 举例,str = "()",返回true:str = "(()())",返回true:str = ...
- Coding Interview Guide -- 数组的partition调整
[题目] 给定一个有序数组arr,调整arr使得这个数组的左半部分没有重复元素且升序,而不用保证右部分是否有序 例如,arr=[1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, ...
- Coding Interview Guide -- 向有序的环形单链表中插入新节点
[题目] 一个环形单链表从头节点head开始不降序,同时由最后的节点指回头节点.给定这样一个环形单链表的头节点head和一个整数num,请生成节点值为num的新节点,并插入到这个环形链表中,保证调整后 ...
- 渣基础:比照Hawstein学Cracking the coding interview(1)
<C++ Primer 第五版>书实在是太长,太厚了.总是看了十几页就看累了,坚持不了多久,想了想还是别勉强自己,决定把它当工具书查看,或者积累足够的C++经验后再翻阅一遍. 目前的打算是 ...
- [译]1-Key-Value Coding Programming Guide 官方文档第一部分
Key-Value Coding Programming Guide 官方文档第一部分 2018.9.20 第一次修正 iOS-KVC官方文档第一部分 Key-Value Coding Program ...
- python单词反转_翻转字符串里的单词
翻转字符串里的单词 题目要求 给定一个字符串,逐个翻转字符串中的每个单 示例: 输入: " the sky is blue", 输出: "blue is sky the ...
- python反转字符串_python翻转字符串
Python 列表截取可以接收第三个参数,参数作用是截取的步长,以下实例在索引 1 到索引 4 的位置并设置为步长为 2(间隔一个位置)来截取字符串: 如果第三个参数为负数表示逆向读取. 以下实例用于 ...
- 算法--------翻转字符串里的单词(Java版本)
题目: 给定一个字符串,逐个翻转字符串中的每个单词.示例 1:输入: "the sky is blue" 输出: "blue is sky the" 示例 2: ...
- python coding style guide 的快速落地实践——业内python 编码风格就pep8和谷歌可以认作标准...
python coding style guide 的快速落地实践 机器和人各有所长,如coding style检查这种可自动化的工作理应交给机器去完成,故发此文帮助你在几分钟内实现coding st ...
最新文章
- Leangoo看板Jenkins配置指南
- SQL实现分组查询取前几条记录
- 量子位「MEET 2022智能未来大会」启动,邀你一起见证AI价值
- 计算机一级挂科率,[转]计算机一级难吗?看了它想挂科,难难难难把此(精)
- 依赖注入[2]: 基于IoC的设计模式
- (2)ZYNQ FPGA加载比特流(FPGA不积跬步101)
- 稀疏矩阵转置 java代码_三元组稀疏矩阵的快速转置
- (zt)ACE中的Proactor介绍和应用实例
- 鼠标悬停显示图片html5,JavaScript 鼠标悬停图片,显示隐藏文本
- catalina配置参数
- socket.io 消息发送
- php中mbsubstr汉字,php中文字符串截取(mb_substr)实例
- The7 — 响应式多用途 WordPress 主题 免费下载
- 黑客攻击-木马程序(3)
- RoaringBitmap位图数据结构及源码分析
- Java selenium 爬取 星图
- 成功解决numpy.ndarray size changed
- 文华学院计算机专业师资,华中科技大学文华学院“最受欢迎教师”名单
- neogeo模拟器 linux,neogeo模拟器
- mysql弱类型_PHP弱类型及相关函数Bypass