[Algorithm] Reverse array of Chars by word
2024-08-29 22:28:23
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));
最新文章
- [译]AngularJS $apply, $digest, 和$evalAsync的比较
- 让所有的浏览器都能识别HTML5标签样式的小插件
- java中常用的工具类(一)
- python框架(flask/django/tornado)比较
- Oracle VM VirtualBox 设置本机与虚拟机共享文件
- web项目学习之spring-security
- 异常处理:你不可能总是对的 - 零基础入门学习Python032
- php memcached缓存集群
- golang 数组反转
- 计蒜客NOIP模拟赛4 D1T2小X的密室
- [转]html5监听任何App自带返回键javascript事件
- java应用程序的运行机制
- iview中,table组件在缩进时产生的bug。
- Git- 命令及使用
- sql整体优化的五种工具
- tp 例子=登录逻辑
- [多问几个为什么]为什么匿名内部类中引用的局部变量和参数需要final而成员字段不用?(转)
- Microchip编译器产品线—MPLAB XC简介
- MyBatis 体系结构
- css - font-size
热门文章
- 【面试总结-编程】多行两列数据,实现同key的value求和并输出
- 【WIN10】Storyboard動畫板
- 【BZOJ 2460】线性基
- bzoj 3172
- 《深入理解Spark-核心思想与源码分析》(五)第五章任务提交与执行
- PHP -- 函数基础入门
- [转][Android] ListView中getView的原理+如何在ListView中放置多个item
- hdu 3340 Rain in ACStar 线段树区间等差数列更新
- Fixed DC-DC Regulator Output Uses A Digitally Controlled Potentiometer
- Skip-External-Locking – MySQL性能参数详解