For example we have:

["p", "r", "e", "f", "e", "t", " ", "m", "a", "k", "e", " ", "p", "r", "a", "t", "i", " c", "e"]

We want to get:

["p", "r", "a", "t", "i", " c", "e", " ", "m", "a", "k", "e", " ", "p", "r", "e", "f", "e", "t"]

Requirement:

  You can only do in array swap, you cannot create a new array.

The way to do it:

  1. Reverse whole string to get:

["e", " c", "i", "t", "a", "r", "p", " ", "e", "k", "a", "m", " ", "t", "e", "f", "e", "r", "p"]

  2. Then we reverse each word to get final result:

["p", "r", "a", "t", "i", " c", "e", " ", "m", "a", "k", "e", " ", "p", "r", "e", "f", "e", "t"]

So the main function should looks like this:

let data = [
"p","r","e","f","e","t"," ",
"m","a","k","e"," ",
"p","r","a","t","i","c","e"
]; function main(_data) {
let data = _data.slice(); reverseWholeString(data);
reverseWords(data, ); return data;
} console.log(main(data));

The reverseWholeString function would be:

function reverseWholeString(data) {
let start = ,
end = data.length - ;
reverseChars(data, start, end);
} function reverseChars(data, start, end) {
while (start < end) {
[data[start], data[end]] = [data[end], data[start]];
start++;
end--;
}
}

reverseWords function would be:

function reverseWords(data, start) {
let index = findEmptyIndex(data, start);
let end = index - ; while (index !== -) {
reverseChars(data, start, end);
start = index + ;
index = findEmptyIndex(data, start);
end = index - ;
} reverseChars(data, start, data.length - );
} function findEmptyIndex(data, start) {
let index;
for (let i = start; i < data.length; i++) {
if (data[i] === " ") {
index = i;
break;
} else {
index = -;
}
} return index;
}

------------

Full code:

let data = [
"p",
"r",
"e",
"f",
"e",
"t",
" ",
"m",
"a",
"k",
"e",
" ",
"p",
"r",
"a",
"t",
"i",
" c",
"e"
]; function reverseWholeString(data) {
let start = 0,
end = data.length - 1;
reverseChars(data, start, end);
} function reverseChars(data, start, end) {
while (start < end) {
[data[start], data[end]] = [data[end], data[start]];
start++;
end--;
}
} function findEmptyIndex(data, start) {
let index;
for (let i = start; i < data.length; i++) {
if (data[i] === " ") {
index = i;
break;
} else {
index = -1;
}
} return index;
}
function reverseWords(data, start) {
let index = findEmptyIndex(data, start);
let end = index - 1; while (index !== -1) {
reverseChars(data, start, end);
start = index + 1;
index = findEmptyIndex(data, start);
end = index - 1;
} reverseChars(data, start, data.length - 1);
} function main(_data) {
let data = _data.slice(); reverseWholeString(data);
reverseWords(data, 0); return data;
} console.log(main(data));

  

最新文章

  1. [译]AngularJS $apply, $digest, 和$evalAsync的比较
  2. 让所有的浏览器都能识别HTML5标签样式的小插件
  3. java中常用的工具类(一)
  4. python框架(flask/django/tornado)比较
  5. Oracle VM VirtualBox 设置本机与虚拟机共享文件
  6. web项目学习之spring-security
  7. 异常处理:你不可能总是对的 - 零基础入门学习Python032
  8. php memcached缓存集群
  9. golang 数组反转
  10. 计蒜客NOIP模拟赛4 D1T2小X的密室
  11. [转]html5监听任何App自带返回键javascript事件
  12. java应用程序的运行机制
  13. iview中,table组件在缩进时产生的bug。
  14. Git- 命令及使用
  15. sql整体优化的五种工具
  16. tp 例子=登录逻辑
  17. [多问几个为什么]为什么匿名内部类中引用的局部变量和参数需要final而成员字段不用?(转)
  18. Microchip编译器产品线—MPLAB XC简介
  19. MyBatis 体系结构
  20. css - font-size

热门文章

  1. 【面试总结-编程】多行两列数据,实现同key的value求和并输出
  2. 【WIN10】Storyboard動畫板
  3. 【BZOJ 2460】线性基
  4. bzoj 3172
  5. 《深入理解Spark-核心思想与源码分析》(五)第五章任务提交与执行
  6. PHP -- 函数基础入门
  7. [转][Android] ListView中getView的原理+如何在ListView中放置多个item
  8. hdu 3340 Rain in ACStar 线段树区间等差数列更新
  9. Fixed DC-DC Regulator Output Uses A Digitally Controlled Potentiometer
  10. Skip-External-Locking – MySQL性能参数详解