壹 ❀ 引

今天做的一道题非常简单,原题来自leetcode第344题反转字符串,题目如下:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

我们先来分析题目,再来说说具体怎么做。

贰 ❀ 解题分析

简单分析题目其实说到底就是倒序排列数组,那么我们马上可以想到数组API reverse,单说实现我们完全可以这样:

/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function(s) {
s.reverse();
};

当然要是面试真遇到这题,肯定不允许这么做,我们可以把这道题理解为实现API reverse,所以还是得另辟途径。

倒序排列数组的本质,其实也是在做元素位置互换,有个规则,比如数组[1,2,3,4]

因为要倒序,所以是第一位与最后一位互换位置,第二位和第三位互换位置。

当然数组元素个数会有基数的情况,但这并不影响这个规律,比如[1,2,3,4,5]还是如此,只是中间位的元素不用互换而已。

在实现代码前,官方已经提供了一个思路,双指针技巧,常规的循环比如for往往是从i=0开始遍历,或者while倒序遍历,这两种都只有一个指针来表示当前遍历到了哪个索引。

而双指针则是从第一个元素与最后一个元素同时相对进行遍历,也就是成对的遍历,可以想象这样遍历的效率会大大提升。

我们已经知道了数组倒序排列是交换位置,那可以用i表示正序遍历,用一个j表示倒序遍历,每遍历一次交换两个元素,而满足遍历的条件仅仅是i<j即可。

以数组[1,2,3,4]来说,1与4遍历一次,2与3遍历一次,此时i为1,j为2,下一步i自增j递减i为2j为1很明显不符合条件。

再看数组[1,2,3,4,5],遍历2次后,i自增j递减都会变成3,同样不满足i<j,所以我们仅仅需要这个条件来决定是否还需要遍历。

说到这思路已经很清晰了,直接上代码:

/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function (s) {
var i = 0,
j = s.length - 1;
for (; i < j; i++, j--) {
[s[i], s[j]] = [s[j], s[i]];
};
};

我在阅读数组和字符串卡片的双指针技巧之前,一直不知道双指针是个啥,到现在心里才有答案。不过我在 JS leetcode 两数之和解答思路分析提供的第二种思路中也想到了从头和从尾同时遍历,虽然我是用了两个循环进行嵌套,不过还是有了点双指针的影子。

那么关于本题就说到这了。

JS leetcode 反转字符串 题解分析的更多相关文章

  1. leetcode 反转字符串

    请编写一个函数,其功能是将输入的字符串反转过来. 示例: 输入:s = "hello" 返回:"olleh" /** * @param {string} s * ...

  2. js常用的字符串方法分析

    ##字符串## 字符串: 由0个或多个字符组成,被成对的英文单引号或双引号包含起来的. 字符编码: 每一个字符在计算机存储的编号. 计算机会保存有一套或几套用于标注编号与字符对应关系的字典.(字符集) ...

  3. javascript(js)反转字符串

    网上看到的都是这个写法较多: str.split('').reverse().join(''); 这里发现一个ES6的写法也可以达到同样的效果: Array.from(str).reverse().j ...

  4. [Leetcode]反转字符串中的单词 III

    题目 代码 class Solution { public: string reverseWords(string s) { for(int i=0,j=0;j<=s.size();j++) { ...

  5. 代码随想录算法训练营day08 | leetcode 344.反转字符串/541. 反转字符串II / 剑指Offer05.替换空格/151.翻转字符串里的单词/剑指Offer58-II.左旋转字符串

    基础知识 // String -> char[] char[] string=s.toCharArray(); // char[] -> String String.valueOf(str ...

  6. C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...

  7. leetCode题解之反转字符串中的元音字母

    1.问题描述 Reverse Vowels of a String Write a function that takes a string as input and reverse only the ...

  8. LeetCode:反转字符串中的元音字母【345】

    LeetCode:反转字符串中的元音字母[345] 题目描述 编写一个函数,以字符串作为输入,反转该字符串中的元音字母. 示例 1: 输入: "hello" 输出: "h ...

  9. Leetcode#557. Reverse Words in a String III(反转字符串中的单词 III)

    题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" 输 ...

  10. Leetcode 557. 反转字符串中的单词 III

    1.题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" ...

随机推荐

  1. AMBA Bus介绍_01

    AMBA总线概述 系统总线简介 AMBA 2.0 AHB - 高性能Bus APB - 外设Bus AHB ASB APB AHB 组成部分 APB组成部分 AMBA协议其他有关问题 DMA DMA ...

  2. C++中vector容器详解

    参考链接:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html 一.什么是vector? 向量(Vector)是一个封装了 ...

  3. [转帖]TiDB 最佳实践

    https://docs.pingcap.com/zh/tidb/stable/tidb-best-practices 本文档总结使用 TiDB 时的一些最佳实践,主要涉及 SQL 使用和 OLAP/ ...

  4. [转帖]Oracle迁移到MySQL时数据类型转换问题

    https://www.cnblogs.com/yeyuzhuanjia/p/17431979.html 最近在做"去O"(去除Oracle数据库)的相关工作,需要将Oracle表 ...

  5. goofys 鲲鹏上面编译挂载与性能测试

    goofys 鲲鹏上面编译挂载与性能测试 介质 使用go进行编译. 官网上面有 amd64的介质,但是没有aarch64的介质 需要自行编译 前几天一直编译失败. 周天在家自己测试了一把,根据gith ...

  6. JVM启动参数脚本的再学习与研究

    JVM启动参数脚本的再学习与研究 摘要 学无止境 前段时间一直再研究JVM参数调优. 但是最近也在想不应该仅研究如何调优. 因为不管怎么设置, 总有猪队友会把环境搞崩. 所以应该想办法在无人值守的情况 ...

  7. Oracle 以及 达梦数据库简单查询所有表行数的存储过程

    1. 今天有一个场景需要查询一个数据库实例下面所有的表的行数. 本来想查询 user_tables 视图 但是发现 这个视图里面 达梦数据库 里面存的是null的.. 百度之后发现一个解决方案是 使用 ...

  8. Stream流处理快速上手最佳实践

    一 引言 JAVA1.8得益于Lambda所带来的函数式编程,引入了一个全新的Stream流概念Stream流式思想类似于工厂车间的"生产流水线",Stream流不是一种数据结构, ...

  9. 结论&定理大全

    定理 1:包含 \(0\) 与 \(2^k-1\) 的按位与或空间和 \(k\) 个点的有传递性的有向图形成双射 证明: 空间->传递闭包:对于任意两个位 \(i,j\),若某个数包含 \(i\ ...

  10. vue如何在render函数中使用判断(2)

    h函数的三个参数 第一个参数是必须的. 类型:{String | Object | Function} 一个 HTML 标签名.一个组件.一个异步组件.或一个函数式组件. 是要渲染的html标签. 第 ...