一、字符串的旋转

描述:给定一个字符串,要求将字符串前面的若干字符移到字符串的末尾。例如,将字符串的 “abcdef” 的前面 3 个字符 ‘a’, ‘b’ ‘c’ 移到字符串的末尾,那么原字符串将变成 “defabc”。

解法一:蛮力移位(循环左移)

较为直观的一种解法即是,将需要移动的字符使用循环左移(ROL,Ring Shift Left)的方式一个一个地移到字符串的尾部。

// 循环左移 1 位,循环左移k位的辅助函数
void ROL1(char* s, int n)
{char t = s[0];for (int i = 1; i < n; ++i)s[i-1] = s[i];s[n-1] = s[0];
}
// 循环左移 k 位
void ROLK(char* s, int n, int k)
{while (k--)                       // while (--k) 会比 while (k--) 少做一次循环ROL1(s, n);
}

时间复杂度分析:对于长度为 n 的字符串,如果左移 m 位的话,时间复杂度为 O(mn).

解法二:三步反转

这是一个稍具 Tricky 的解法,且解法具有普世性,句子中单词的翻转,即可使用该解法解决:

  • (1)将源字符串分为 X 和 Y 两部分,其中 X 为 “abc”,Y 为 “def”
  • (2)翻转 X,翻转 Y,X ⇒ “cba”,Y ⇒ “fed”
  • (3)整体翻转,”cbafed” ⇒ “defabc”
// 辅助函数
void ReverseString(char* s, int from, int to)
{while (from  < to){char t = s[from];s[from++] = s[to];s[to--] = t;}
}// 三步反转
void LeftRotateString(char* s, int n, int m)
{m %= n;ReverseString(s, 0, m-1);ReverseString(s, m, n-1);ReverseString(s, 0, n-1);
}

时间复杂度为:O(n)

二、单词的翻转

输入一个英文句子,翻转句子中单词的顺序,要求单词内字符的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母做同样处理。

“I am a student.” ⇒ “student. a am I”

沿用“三步反转”法的思路,先将每个单词自翻转,再整体翻转,求解的难点在于,每个单词的确定,我们使用数组索引的方式确定每个单词的起始和截止。

void ReverseWords(char* s, int n)
{int arr[255] = { 0 };int idx = 0;for (int i = 0; i < n; ++i){if (s[i] == ' ')arr[idx++] = i;}idx -= 1;ReverseString(s, 0, arr[0]-1);for (int i = 0; i < idx; ++i){ReverseString(s, arr[i]+1, arr[i + 1]-1);}ReverseString(s, arr[idx] + 1, n-1);ReverseString(s, 0, n - 1);
}

算法——从旋转字符串到翻转单词相关推荐

  1. 《剑指offer》-- 和为S的连续整数序列、和为S的两个数字、左旋转字符串、翻转单词顺序列

    一.和为S的连续整数序列: 1.题目: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100 ...

  2. 【剑指offer{40-44}】和为S的连续正数序列、和为S的两个数字、左旋转字符串、翻转单词顺序列、扑克牌顺子

    文章目录 和为S的连续正数序列 题目描述 C++代码 和为S的两个数字 题目描述 C++代码 左旋转字符串 题目描述 C++代码 翻转单词顺序列 题目描述 C++代码 扑克牌顺子 题目描述 C++代码 ...

  3. 字符串算法 —— 两字符串相同的单词

    1. navie:集合 intersect 以集合的形式分别存放两字符串,然后求集合交集. def common_words_naive(str1, str2):str1_set = set(str1 ...

  4. 代码随想录算法训练营第八天|● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符

    一.344.反转字符串 力扣 思路:很简单的一个for循环双指针,left和right交换. class Solution {public void reverseString(char[] s) { ...

  5. 代码随想录算法训练营第08天 | LeetCode 344.反转字符串,541. 反转字符串2,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串

    LeetCode [344. 反转字符串] 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须**原地修改输入数组**. ...

  6. 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串

    一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...

  7. 剑指Offer:翻转单词顺序 vs 左旋转字符串

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

  8. 【剑指offer-Java版】42翻转单词顺序VS左旋转字符串

    反转单词顺序以及左旋转字符串:输入一个英文句子,翻转句子中的单词顺序,单词内部的字母顺序是不变的 – I am a student. -> student. am I 第一步,翻转句子中的所有字 ...

  9. [剑指offer]面试题42:翻转单词顺序 VS左旋转字符串

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

最新文章

  1. No Code的世界绝无代码!GitHub CEO:编码的未来根本就没有编码
  2. IOS开发笔记12-Object-C中的对象与内存
  3. Python学习之datetime时间戳
  4. 使用map的find头文件_C++ map的基本操作和使用
  5. oracle oms可以调用吗,oracle oms
  6. 遍历目录下的所有文件-os.walk
  7. 计算机软件知识pdf,[计算机软件及应用]PDF基础知识.doc
  8. 2011/05/19
  9. 消息队列(MQ)比较
  10. 学校教材订购系统 Java_高校网上教材征订系统,基于SSM框架下的JAVA系统
  11. Unity-粒子特效
  12. excel白屏未响应_Excel中出现无响应的解决方法
  13. 30天自制操作系统(day1)
  14. 支付宝、微信(pc+h5)支付
  15. 1.GraphPad Prism 8软件安装
  16. 竖版视频怎么批量转换成横版视频
  17. 【opencv机器学习】基于SVM和神经网络的车牌识别
  18. Cutecom无法打开USB串口
  19. 2022-2028全球与中国实验室烧结炉市场现状及未来发展趋势
  20. JAVA第四次作业——使用枚举类对扑克牌建模

热门文章

  1. Navicat加载缓慢
  2. java中$和 的区别详解_MyBatis中#{}和${}的区别详解
  3. Pytorch——保存训练好的模型参数
  4. TensorFlow基础篇(三)——tf.nn.softmax_cross_entropy_with_logits
  5. Linux 平台中调试 C/C++ 内存泄漏方法
  6. mfc 对话框应用程序 如何利用按钮弹出另一对话框
  7. C++实现简单的文件I/O操作
  8. Stanford机器学习---第三讲. 逻辑回归和过拟合问题的解决 logistic Regression Regularization
  9. php入门代码 基础慕课,php基础入门
  10. 各大快递公司面单号准确性验证的正则表达式,来自淘宝开放平台,时间是20181206,...