string - 在不到 o(n^2) 的时间内使用常数空间交换 char* 中的两个单词
问题描述
给一个字符串一个 char*,比如包含“hellosir”,以及每个单词的长度,如何在小于 o(n^2) 的时间内使用常量空间返回一个包含“sirhello”的 char*?(我在一次技术面试中被问到这个问题)
函数签名:
char* swapWords(char* str, int firstWordLen, int secondWordLen);
在“hellosir”示例中,firstWordLen 为 5,secondWordLen 为 3。
谢谢
解决方案
char* swapWords(char* str, int firstWordLen, int secondWordLen) {
char* newStr = (char*) malloc(sizeof(char) * (firstWordLen + secondWordLen + 1));
for(int i = 0; i < secondWordLen; i++) {
newStr[i] = str[firstWordLen + i];
}
for(int i = 0; i < firstWordLen; i++) {
newStr[secondWordLen + i] = str[i];
}
newStr[firstWordLen + secondWordLen] = 0;
return newStr;
}
解释:
- 循环第二个单词,它从第一个单词的末尾开始,所以 firstWordLen + i,并将字符放在新字符数组的开头
- 循环第一个单词,所以从 0 到 firstWordLen 并将它放在之前放置的第二个单词的末尾,所以在 secondWordLen + i
- 由于空终止,将 0 添加到新 char 数组的末尾
Ah ok, this is not constant space my bad,速度是O(n),但是空间也是O(n)
推荐阅读
- dart - 如何在颤振中获得其他类的功能?
- react-leaflet - 如何将我的自定义地图图块的返回 url 传递给 react-leaflet?
- c++ - 高精度线程同步
- html - 在css中裁剪视频的底部
- vba - 当特定范围内的值 = 同一张表中另一个范围内的值时,则
- javascript - 在 Node.js 中打印年份的最短方法?
- python - 如何在 for 循环中访问我的类中的数组元素
- javascript - 使用 Google Diff Match Patch 获取差异的第一行和第一列?
- php - 在 Laravel 5.7 中使用 nusoap_client 检索 28,000 条记录数据时分配内存
- arrays - 为循环中的每次迭代重置数组