一道国外前端面试题引发的Coding...
刚刚看到CSDN微信公众号一篇文章,关于国外程序员面试前端遇到的一道测试题,有点意思,遂写了下代码,并记录一下~
题目是这样的:
['Tokyo', 'London', 'Rome', 'Donlon', 'Kyoto', 'Paris']
// YOUR ALGORITHM
[
['Tokyo', 'Kyoto'],
['London', 'Donlon'],
['Rome'],
['Paris']
]
也就是说给定一个字符串数组:
['Tokyo', 'London', 'Rome', 'Donlon', 'Kyoto', 'Paris']
经过自己写的算法变换后,要得到下面这个数组:
[
['Tokyo', 'Kyoto'],
['London', 'Donlon'],
['Rome'],
['Paris']
]
经过观察,原来题目要求把原数组中“相关”的元素组成新的数组,并作为最终答案数组的一个元素。
“相关”的意思是指:如果一个长度为 N 的字符串 A,依次将最左边的字符挪到最右边,重复 N-1 遍,得到 N 个(包含原字符串)字符串中的任意一个,跟字符串 B 相同(不考虑大小写),则认为 A 跟 B “相关”。
于是,先来一个比较函数:
/**
* 匹配函数 compareString
* @param strA 要比较的字符串
* @param strB 要比较的另一个字符串
* @return 0: 表示匹配, -1: 表示不匹配
*/
function compareString(strA, strB) {
if(strA.length !== strB.length)return -1;//长度不相等肯定不会匹配,立即返回 var a = strA.toLowerCase();//先将要比较的字符串转换成小写,下同
var b = strB.toLowerCase();
var i = 0; do{
if(a === b)return 0;//匹配,返回 0
b = b.substr(1) + b.substr(0, 1);//将第一个字符转移至尾部
i++;
}while(i < b.length); return -1;//360 度检查还没认出来,那 A、B 两个是无缘了~
}
假设原数组是:
var dataArr = ['Tokyo', 'London', 'Rome', 'Donlon', 'Kyoto', 'Paris'];
结果存入:
var result = [];
那么可以如下处理:
while(dataArr.length > 1) {
var str = dataArr.shift();//取数组第一个元素,与后续元素逐个对比
var newArr = [];//本轮匹配结果存储的数组
newArr.push(str);//先将要对比的 str 存入数组
var i = 0;
//为什么不用 for 循环呢?
//因为在循环体内可能“剪切”元素导致数组长度变小,所以不能用固定次数循环
while(i < dataArr.length) {
if(compareString(str, dataArr[i]) == 0) {//匹配
newArr.push(dataArr[i]);//将匹配元素加入新数组
//从原数组中移除当前元素
//当前元素移除后,后面的元素依次往前移动一格,因此下一次遍历的下标不变
dataArr.splice(i, 1);
}else{
i++;//本轮循环没有匹配上,下一轮匹配轮到后面一个元素,因此下标要加 1
}
}
result.push(newArr);//将本次匹配数组加入 result 数组
}
if(dataArr.length > 0)result.push(dataArr);//落单的跟上
用 node 执行,结果如下图:

完整代码如下:
/*
['Tokyo', 'London', 'Rome', 'Donlon', 'Kyoto', 'Paris']
// YOUR ALGORITHM
[
['Tokyo', 'Kyoto'],
['London', 'Donlon'],
['Rome'],
['Paris']
]
*/ //====================================== /**
* Coding by Jaffray Tan
* 2018.07.03
*/
var dataArr = ['Tokyo', 'London', 'Rome', 'Donlon', 'Kyoto', 'Paris'];
console.log('\nInit array:\n', dataArr);//先输出原数组
var result = []; while(dataArr.length > 1) {
var str = dataArr.shift();//取数组第一个元素,与后续元素逐个对比
var newArr = [];//本轮匹配结果存储的数组
newArr.push(str);//先将要对比的 str 存入数组
var i = 0; //为什么不用 for 循环呢?
//因为在循环体内可能“剪切”元素导致数组长度变小,所以不能用固定次数循环
while(i < dataArr.length) {
if(compareString(str, dataArr[i]) == 0) {//匹配
newArr.push(dataArr[i]);//将匹配元素加入新数组
//从原数组中移除当前元素
//当前元素移除后,后面的元素依次往前移动一格,因此下一次遍历的下标不变
dataArr.splice(i, 1);
}else{
i++;//本轮循环没有匹配上,下一轮匹配轮到后面一个元素,因此下标要加 1
}
} result.push(newArr);//将本次匹配数组加入 result 数组
} if(dataArr.length > 0)result.push(dataArr);//落单的跟上 console.log('\n\nResult array:\n', result);//输出结果 //===================================== /**
* 匹配函数 compareString
* @param strA 要比较的字符串
* @param strB 要比较的另一个字符串
* @return 0: 表示匹配, -1: 表示不匹配
*/
function compareString(strA, strB) {
if(strA.length !== strB.length)return -1;//长度不相等肯定不会匹配,立即返回 var a = strA.toLowerCase();//先将要比较的字符串转换成小写,下同
var b = strB.toLowerCase();
var i = 0; do{
if(a === b)return 0;//匹配,返回 0
b = b.substr(1) + b.substr(0, 1);//将第一个字符转移至尾部
i++;
}while(i < b.length); return -1;//360 度检查还没认出来,那 A、B 两个是无缘了~
}
一道国外前端面试题引发的Coding...的更多相关文章
- 金三银四求职季,前端面试题小梳理(HTML、CSS、JS)
好久没写学习记录,最近太多事,又到一年求职季,都说金三银四求职季,自己也做一下最近学习的一些前端面试题梳理,还是个小白,写的不对请指正,不胜感激. HTML篇 html语义化 用语义化的代码标签书写, ...
- 前端面试题(4)JavaScript
前端面试题JavaScript(一) JavaScript的组成 JavaScript 由以下三部分组成: ECMAScript(核心):JavaScript 语言基础 DOM(文档对象模型):规定了 ...
- 【web前端面试题整理02】前端面试题第二弹袭来,接招!
前言 今天本来准备先了解下node.js的,但是,看看我们一个小时前与一个小时后的差距: 既然如此,我们继续来搜集我们的前端面试题大业吧!!! 特别感谢玉面小肥鱼提供哟,@玉面小飞鱼 题目一览 Jav ...
- 2016最全的web前端面试题及答案整理
面试web前端开发,不管是笔试还是面试,都会涉及到各种专业技术问题,今天小编整理了一些常见的web前端面试题及答案,希望对大家有所帮助. 1.常用那几种浏览器测试?有哪些内核(Layout Engin ...
- 【重点--web前端面试题总结】
前端面试题总结 HTML&CSS: 对Web标准的理解.浏览器内核差异.兼容性.hack.CSS基本功:布局.盒子模型.选择器优先级及使用.HTML5.CSS3.移动端适应. JavaScri ...
- web前端面试题库
web前端面试题及答案 1.常用那几种浏览器测试?有哪些内核(Layout Engine)? 答: (Q1) 浏览器:IE,Chrome,FireFox,Safari,Opera. (Q2) ...
- 前端面试题 -- JS篇
前端面试题 -- JS篇 类型 1.js中有哪些数据类型,并解释清楚原始数据类型和引用数据类型 js中共有null,undefined, string,number,boolean,object六种数 ...
- 前端面试题总结(三)JavaScript篇
前端面试题总结(三)JavaScript篇 一.谈谈对this的理解? this是一个关键字. this总是指向函数的直接调用者(而非间接调用者). 如果有new关键字,this指向new出来的那个对 ...
- 前端面试题2016--HTML
本文由我收集总结了一些前端面试题,初学者阅后也要用心钻研其中的原理,重要知识需要系统学习.透彻学习,形成自己的知识链.万不可投机取巧,临时抱佛脚只求面试侥幸混过关是错误的!也是不可能的!不可能的!不可 ...
随机推荐
- 夯实Java基础系列21:Java8新特性终极指南
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- nginx(tengine)访问日志分片
说明 nginx日志按天分片是运维的基本要求,不仅可以减小文件大小,方便检索关键数据,也可以定时删除过期的日志.可是nginx和tengine默认并不支持文件分片,因此需要额外处理. 另外,日志分片需 ...
- 「面试高频」二叉搜索树&双指针&贪心 算法题指北
本文将覆盖 「字符串处理」 + 「动态规划」 方面的面试算法题,文中我将给出: 面试中的题目 解题的思路 特定问题的技巧和注意事项 考察的知识点及其概念 详细的代码和解析 开始之前,我们先看下会有哪些 ...
- 我的Java秋招面经大合集
阿里面经 阿里中间件研发面经 蚂蚁金服研发面经 岗位是研发工程师,直接找蚂蚁金服的大佬进行内推. 我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer. 然后我也参加了 ...
- 编译 lame for iOS
网上找了许多编译lame的教程,结果都是编译失败,多次尝试后发现是编译脚本放错路径了,记录下编译的过程,把编译脚本放到源码文件夹中和修改编译脚本中的目录是关键: 一.首先去Lame官网 http:// ...
- Springboot】Springboot整合邮件服务(HTML/附件/模板-QQ、网易)
介绍 邮件服务是常用的服务之一,作用很多,对外可以给用户发送活动.营销广告等:对内可以发送系统监控报告与告警. 本文将介绍Springboot如何整合邮件服务,并给出不同邮件服务商的整合配置. 如图所 ...
- git的下载及简单使用一
git 是世界上最先进的分布式版本控制系统 常用的git网站 GitHub gitee(码云) git的下载地址 https://git-scm.com/downloads 而后根据计算机的系统选择相 ...
- SVN部署(基于Linux)
第一步:通过yum命令安装svnserve,命令如下: yum -y install subversion 此命令会全自动安装svn服务器相关服务和依赖,安装完成会自动停止命令运行 若需查看svn安装 ...
- Java编程思想——第17章 容器深入研究 读书笔记(三)
七.队列 排队,先进先出. 除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: ad ...
- 想转行做程序员,目前想学WEB前端,想问该自学还是报培训班
首先我们还是先看一下WEB前端目前的工资情况吧,我在IT招聘网站拉勾网来进行搜索1-3年WEB前端工作经验大专学历的条件来看. 深圳: 可以看出目前深圳的平均的工资都在10K以上,因为大城市给的机会多 ...