资讯专栏INFORMATION COLUMN

JavaScript算法题之–查找不同顺序排列的字符串

zhjx922 / 1986人阅读

摘要:来自雨夜带刀需求描述从一组数组中找出一组按不同顺序排列的字符串的数组元素。最后用编码和作为对象的来保存编码和一致的字符串。方法方法是将字符串转换成数组后再对数组进行排序,和使用排序后会变成,将拍好序的字符串作为对象的来保存排序一致的字符串。

(准备面试,多看点题。来自雨夜带刀"s Blog )

需求描述:从一组数组中找出一组按不同顺序排列的字符串的数组元素。假如有这样一个数组:

</>复制代码

  1. [ "abcd", "hello", "bdca", "olleh", "cadb", "nba", "abn", "abc" ]

需要找出的结果是:

</>复制代码

  1. [ "abcd", "bdca", "cadb" ]

那么这里的关键点是判断一组字符串是否是否只是字符的顺序不同,只要解决整个关键点其他都好办了。

方法1:

</>复制代码

  1. var stringClassify = function( arr ){
  2. var arrLength = arr.length,
  3. obj = {},
  4. i = 0,
  5. num, item, name, firstItem, strLength;
  6. for( ; i < arrLength; i++ ){
  7. item = arr[i];
  8. strLength = item.length;
  9. num = 0;
  10. // 将单个的字符转换成 Unicode 编码
  11. // 对编码进行取和计算
  12. for( j = 0; j < strLength; j++ ){
  13. num += item.charCodeAt( j );
  14. }
  15. if( !firstItem ){
  16. firstItem = item;
  17. obj[ num ].push( item );
  18. }
  19. // 通过检测待添加的字符串的第一个字符是否
  20. // 在另一个字符串中出现以避免将下面的情况
  21. // [ "ad", "da", "bc" ]
  22. else if( ~firstItem.indexOf(item.charAt(0)) ){
  23. obj[ num ].push( item );
  24. }
  25. }
  26. for( name in obj ){
  27. console.log( obj[name] );
  28. }
  29. };

方法1采用了遍历字符串中的每一个字符,然后将单个的字符转换成 Unicode 编码,对编码进行取和的计算,abcd 和 bdca 的编码和会是一致的。最后用编码和作为对象的 key 来保存编码和一致的字符串。

方法 1 需要注意的是,字符串“ad”和“bc”的 Unicode 编码和是一样的,此时需要多加一个判断,检测任意一个字符串中的第一个字符是否有出现在另一个字符串中出现过即可。

方法2:

</>复制代码

  1. var stringClassify = function(){
  2. var arrLength = arr.length,
  3. obj = {},
  4. i = 0,
  5. num, item, name, strArr, newStr;
  6. for( ; i < arrLength; i++ ){
  7. item = arr[i];
  8. strArr = arr[i].split( "" );
  9. strArr.sort();
  10. newStr = strArr.join( "" );
  11. if( !obj[newStr] ){
  12. obj[ newStr ] = [];
  13. }
  14. obj[ newStr ].push( item );
  15. }
  16. for( name in obj ){
  17. console.log( obj[name] );
  18. }
  19. };

方法2是将字符串转换成数组后再对数组进行 sort 排序,abcd 和 bdca 使用 sort 排序后会变成 abcd,将拍好序的字符串作为对象的 key 来保存排序一致的字符串。

其实两种方法的原理都是通过将字符转换成 Unicode 编码,只是方法1是显式的转换,而方法2中用到的 sort 排序,会隐式的转换。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85462.html

相关文章

  • JS算法题之leetcode(1~10)

    摘要:先去空白,去掉空白之后取第一个字符,判断正负符号,若是英文直接返回,若数字则不取。回文数题目描述判断一个整数是否是回文数。回文数是指正序从左向右和倒序从右向左读都是一样的整数。 JS算法题之leetcode(1~10) 前言 一直以来,前端开发的知识储备在数据结构以及算法层面是有所暂缺的,可能归根于我们的前端开发的业务性质,但是我认为任何的编程岗位都离不开数据结构以及算法。因此,我作为...

    SoapEye 评论0 收藏0
  • JavaScript算法题之–随机数生成

    摘要:准备面试,多看点题。来自雨夜带刀需求描述从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现。 (准备面试,多看点题。来自雨夜带刀s Blog) 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现。 先来生成一个有序的数组: var arr = [], length = 100, i = 0; for( ; i < length;...

    tigerZH 评论0 收藏0
  • 面试题之从敲入 URL 到浏览器渲染完成

    摘要:响应由三个部分组成,分别是状态行消息报头响应正文。详情参考小汪之前写的文章浏览器内核之解释器和模型解释解释过程是指从字符串经过解释器处理后变成渲染引擎内部规则的表示过程。 showImg(https://segmentfault.com/img/remote/1460000016404846); 前言 小汪最近在看【WebKit 技术内幕】一书,说实话,这本书写的太官方了,不通俗易懂。...

    MAX_zuo 评论0 收藏0
  • JavaScript数据结构和算法

    摘要:栈被称为一种后入先出的数据结构。散列使用的数据结构叫做散列表。这些操作需要求助于其他数据结构,比如下面介绍的二叉查找树。 前言 在过去的几年中,得益于Node.js的兴起,JavaScript越来越广泛地用于服务器端编程。鉴于JavaScript语言已经走出了浏览器,程序员发现他们需要更多传统语言(比如C++和Java)提供的工具。这些工具包括传统的数据结构(如链表,栈,队列,图等),...

    EastWoodYang 评论0 收藏0
  • JS算法题之leetcode(11~20)

    摘要:给定一个整数,将其转为罗马数字。字符数值例如,罗马数字写做,即为两个并列的。通常情况下,罗马数字中小的数字在大的数字的右边。给定一个罗马数字,将其转换成整数。注意空字符串可被认为是有效字符串。 JS算法题之leetcode(11~20) showImg(https://segmentfault.com/img/bVbwmfg?w=1790&h=714);这次的十道题目都比较容易,我们简...

    CoderDock 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<