[Algorithm] Reverse array of Chars by word
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, 0); return data; } console.log(main(data));
The reverseWholeString function would be:
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--; } }
reverseWords function would be:
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 findEmptyIndex(data, start) { let index; for (let i = start; i < data.length; i++) { if (data[i] === " ") { index = i; break; } else { index = -1; } } return index; }
------------
Full code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | 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)); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2018-02-15 [Tools] Using mobile device for debugging your mobile web site
2018-02-15 [Tools] Create your own mobile emulator device by using Chrome dev tool
2017-02-15 [Ramda] Refactor to Point Free Functions with Ramda using compose and converge
2017-02-15 [React Native] Writing Platform-Specific Components for iOS and Android in React Native
2016-02-15 [Regular Expressions] Find a String that Precedes Another String ?= , ?!
2016-02-15 [Regular Expressions] Find Groups of Characters, and ?: