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));

  

[Algorithm] Reverse array of Chars by word的更多相关文章

  1. [Algorithm] Reverse a linked list

    It helps to understands how recursive calls works. function Node(val) { return { val, next: null }; ...

  2. [Algorithm] Chunk Array

    // --- Directions// Given an array and chunk size, divide the array into many subarrays// where each ...

  3. Reverse array

    数组颠倒算法 #include <iostream> #include <iterator> using namespace std; void reverse(int* A, ...

  4. reverse array java

    /* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import ...

  5. CUDA学习,使用shared memory实现Reverse Array

  6. java.lang.String

    1.String 是一个类,广泛应用于 Java 程序中,相当于一系列的字符串.在 Java 语言中 strings are objects.创建一个 strings 最直接的方式是 String g ...

  7. Java基础教程(20)--数字和字符串

    一.数字   在用到数字时,大多数情况下我们都会使用基本数据类型.例如: int i = 500; float gpa = 3.65f; byte mask = 0xff;   然而,有时候我们既需要 ...

  8. [Swift]LeetCode557. 反转字符串中的单词 III | Reverse Words in a String III

    Given a string, you need to reverse the order of characters in each word within a sentence while sti ...

  9. JavaScript Array 常用函数整理

    按字母顺序整理 索引 Array.prototype.concat() Array.prototype.filter() Array.prototype.indexOf() Array.prototy ...

随机推荐

  1. git clone https

    git clone 不需要输入密码步骤 1, vim ~/.git-credentials 2, git config --global credential.helper store 3, vim ...

  2. 用三个线程循环输出ABC

    前两天看Java吧有人求助这个问题.想了想并不是很难.今天就顺手实现了一下. 我自己想到的有两种方法,一个是使用synchronized,一个是使用lock. 一.synchronized packa ...

  3. Bzoj2120/洛谷P1903 数颜色(莫队)

    题面 Bzoj 洛谷 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为\(n^{\frac 23}\)),对于每一个询问操 ...

  4. BZOJ1084 SCOI2005最大子矩阵

    考虑DP f[i][j][k]表示一行到i一行到j共取k块最大值,类似于最长公共子序列n^2那种 注意相等时可以一起拿 By:大奕哥 #include<bits/stdc++.h> usi ...

  5. bzoj 3944 杜教筛

    题目中要求phi和miu的前缀和,利用杜教筛可以推出公式.我们令为 那么有公式 类比欧拉函数,我们可以推出莫比乌斯函数的和公式为  (公式证明懒得写了,主要核心是利用Dirichlet卷积的性质 ph ...

  6. 72.2801 LOL-盖伦的蹲草计划(广搜)

    时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 众所周知,LOL这款伟大的游戏,有个叫盖伦的英雄.他的伟大之处在 ...

  7. JDK源码(1.7) -- java.util.ListIterator<E>

    java.util.ListIterator<E> 源码分析(JDK1.7) ------------------------------------------------------- ...

  8. PHP -- 模拟测试上传文件

    FROM :http://web.itivy.com/article-740-1.html QQ上传文件为什么那么快? “QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有 ...

  9. python开发_shelve_完整版_博主推荐

    ''' python中的shelve模块,可以提供一些简单的数据操作 他和python中的dbm很相似. 区别如下: 都是以键值对的形式保存数据,不过在shelve模块中, key必须为字符串,而值可 ...

  10. Linux知识(3)----常用快捷键和命令

    这里收集整理了一些常用的命令. 1.常用快捷键 这个链接介绍很全:http://blog.sina.com.cn/s/blog_8cb5c0e501012l7x.html 1. Ctrl + W: 关 ...