网上汇总而来的题目。

第一题:

用 JavaScript 写一个函数,输入 int 型(正整数),返回整数逆序后的字符串。如:输入整型 1234,返回字符串“4321”。

要求必须使用递归函数调用,不能用全局变量,输入函数必须只有一个参数传入,必须返回字符串。

查看代码

 // 推荐方法
function format(num) {
const num1 = num / 10;
const num2 = num % 10;
if (num1 < 1) {
return `${num}`;
} else {
num = parseInt(num1);
return `${num2}${format(num)}`;
}
}
// 其他实现方法
function format(num) {
return `${num}`.length === 1 ? `${num}` : `${num}`.slice(-1) + format(`${num}`.slice(0, -1));
}
function format(num) {// 不符合题意,就当顺便复习下这些api吧 emmmm....
return num < 10 ? `${num}` : `${num}`.split('').reverse().join('');
}
// 方法1简写
function format(num) {
return num / 10 < 1 ? `${num}` : `${num % 10}${format(parseInt(num / 10))}`;
}

第二题:

给定两个数组,写一个方法来计算它们的交集。

例如:给定 nums1 = [1, 2, 2, 1],nums2 = [2, 2],返回 [2, 2]。

查看代码

巨佬的总结:算法题,求两个数组的最长公共子序列。

思路1:空间换时间。建个表,存放其中一个数组的值和该值出现的次数。此处遍历n次,n为数组的长度。

接着遍历另外一个数组。如果数组的值出现在表的键里,则把值push进result数组。该键对应的值减一。此处遍历m次,m为数组的长度。时间复杂度O(m+n)。

代码实现:

 function myIntersection(arr1, arr2) {
const result = [];
const map = {}; for (let val of arr1) {
if (!!map[val]) {
map[val]++;
} else {
map[val] = 1;
}
} arr2.forEach(val => {
if (!!map[val]) {
result.push(val);
map[val]--;
}
});
return result;
}

思路2:时间换空间。遍历其中一个数组,判断另外一个数组中是否包含该值,有则push进result数组,并在另外一个数组中删除该值。

代码实现:

 function myIntersection(arr1, arr2) {
const _arr2 = [...arr2];
return arr1.filter(val => {
const idx = _arr2.indexOf(val);
if (idx > -1) {
_arr2.splice(idx, 1);
return true;
}
return false;
});
}

这里直接filter方法返回数组,需要注意的是splice方法会改变原数组。


第三题:

冒泡排序如何实现,时间复杂度是多少, 还可以如何改进?

查看代码

 function myBubbleSort(arr, cb = (x, y) => x - y) {
const res = cb(1, 2); let i, j, len = arr.length;
if (res < 0) {// 升序
for (i = 0; i < len; i++) {
for(j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
} else {// 降序
for (i = 0; i < len; i++) {
for(j = len - 1; j > i; j--) {
if (arr[j] > arr[j - 1]) {
[arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];
}
}
}
}
}

时间复杂度O(n^2)。简单改进:

function myBubbleSort(arr) {
let len = arr.length - 1; while (len > 0) {
let pos = 0; for (let i = 0; i < len; i++) {
if (arr[i] > arr[i + 1]) {
pos = i;
[arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
}
}
len = pos;
}
}

思路是把可能出现的好的情况挑出来。注意以上都直接改变了原数组。


第四题:

某公司 1 到 12 月份的销售额存在一个对象里面。

如下:{1:222, 2:123, 5:888},请把数据处理为如下结构:[222, 123, null, null, 888, null, null, null, null, null, null, null]

查看代码

 function format(origin) {
const res = [];
for (let i = 0; i < 12; i++) {
res[i] = origin[i + 1] || null;
}
return res;
}

或者

 function format(origin) {
return Array.from(new Array(12)).map((_, i) => origin[i + 1] || null);
}

第五题:

使用 sort() 对数组 [3, 15, 8, 29, 102, 22] 进行排序,输出结果

查看代码

 [3, 15, 8, 29, 102, 22].sort();

输出结果是:[102, 15, 22, 29, 3, 8]。

sort方法在不传回调函数的情况下。默认将值转化成字符串,然后按照字符串字符的utf-16编码比较大小。

先比较首字符。如果首字符相同,则比较第二个字符,以此类推。升序。

js查看字符串字符utf-16编码对应api是String.prototype.charCodeAt();


第六题:

两个数组合并成一个数组

请把两个数组 ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'] 和 ['A', 'B', 'C', 'D'],合并为 ['A1', 'A2', 'A', 'B1', 'B2', 'B', 'C1', 'C2', 'C', 'D1', 'D2', 'D']。

查看代码

就这题而言:

 const arr1 = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'];
const arr2 = ['A', 'B', 'C', 'D'];
const _arr = arr1.concat(arr2.map(val => `${val}3`));
const newArr = _arr.sort().map(val => val.includes('3') ? val.replace('3', '') :
val);

或者:

 const newArr = arr2.reduce((cur, next) => [...cur, ...arr1.filter(val => val.startsWith(next)), next], []);

第七题:

已知如下数组:

var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];

编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

查看代码

方法1:

const arr3 = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
const arr5 = [...new Set(arr3.flat(Infinity))].sort((x, y) => x - y);

flat方法可以将数组拍扁。Set构造函数去重,sort方法排序。

方法2:

const arr3 = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
const arr6 = Array.from(new Set(arr3.join(',').split(',').map(Number).sort((x, y) => x - y)));

set构造函数去重,join方法把数组拍扁,由于值变成了字符串,split方法转成数组后,map方法加Number转成数字。sort方法排序。

方法3:

function format(arr) {
return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(format(val)) : acc.concat(val), []);
}
  

  const arr3 = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], [10]];
  const arr4 = [...new Set(format(arr3))].sort((x, y) => x - y);

reduce、concat方法加递归把数组拍扁。Set构造函数去重。sort方法排序。

方法4:

 function format(arr) {
const res = [];
const stack = [...arr];
while (stack.length) {
const next = stack.pop();
if (Array.isArray(next)) {
stack.push(...next);
} else {
res.push(next);
}
}
return [...new Set(res)].sort((x, y) => x - y);
}

栈方法把数组拍扁。使用数组的push、pop方法实现后进先出。


第八题:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。

  2. 尽量减少操作次数。

查看代码

方法1:冒泡排序的思路。比较相邻两个值,若为0,交换位置。代码演示:

 function format(arr) {
let len = arr.length - 1; while (len) {
let pos = 0; for (let i = 0; i < len; i++) {
if (arr[i] === 0) {
[arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
pos = i;
}
} len = pos;
}
}

方法2:数组的push方法实现0的移动,splice方法保持顺序不变。代码演示:

验证:

 function format(arr) {
let i, len = arr.length;
for (i = 0; i < len; i++) {
if (arr[i] === 0) {
arr.push(0);
arr.splice(arr.indexOf(0), 1);
i--;
len--;
}
}
}

push0进数组后,遍历长度需要减1。0无需在遍历。删除数组当前项后,i需减1

const arr = [5, 0, 0, 0, 3, 0, 12, 0];
format(arr);
console.log(arr);


第九题:

打印出 1 - 10000 之间的所有对称数

例如:121、1331 等

查看代码

方法1:对称数反过来也是原来那个数,利用这个特点。

function printNum() {
return [...Array(10000).keys()].filter(val => val > 10 && `${val}`.split('').reverse().join('') == val);
}

不管三七二十一循环10000次,每个值先转成字符串再拆成数组在反转在转化成字符串,最后利用隐式转换与原值比较,判断是否相等。

方法2:

 function printNum() {
let i, _i, res = [];
for (i = 1; i < 10; i++) {
res.push(i * 11);
_i = 0;
while (_i < 10) {
res.push(i * 101 + _i * 10);
res.push(i * 1001 + _i * 110);
_i++;
}
}
return res;
}

利用对称数的特点,用数学的方式实现。外层循环9层,1-9。内层10次。总共90次。


第十题:

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

查看代码

方法1:pop、unshift方法实现从尾到头。

 function carousel(arr, k = 0) {
let i, len = arr.length;
for (i = 0; i < k % len; i++) {
arr.unshift(arr.pop(len - 1));
}
}

k值有可能大于数组长度,取余可以避免不必要的循环。

方法2:

function carousel([...arr], k = 0) {
return arr.splice(-k % arr.length).concat(arr);
}

k值有可能大于数组长度,对数组长度取余,余数为需要旋转的个数。利用splice方法第一个参数为负数时,值为数组长度+负值。

截取需要旋转的部分,然后再和原数组拼接。

有错误的地方欢迎指出。

javascript 常见的面试题---数组 && 算法的更多相关文章

  1. 关于JavaScript 常见的面试题

    关于JavaScript常见的面试题总结 一.JavaScript基本数据类型 null:空.无.表示不存在,当为对象的属性赋值为null,表示删除该属性 undefined:未定义.当声明变量却没有 ...

  2. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

  3. javascript常见方法汇总之一——数组字符串相关

    (转载至慕课网) 原文链接:https://www.imooc.com/article/46933 github地址:https://github.com/dorseysen/notes-about- ...

  4. JS中几种常见的数组算法(前端面试必看)

    JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...

  5. 数据结构和算法(Golang实现)(13)常见数据结构-可变长数组

    可变长数组 因为数组大小是固定的,当数据元素特别多时,固定的数组无法储存这么多的值,所以可变长数组出现了,这也是一种数据结构.在Golang语言中,可变长数组被内置在语言里面:切片slice. sli ...

  6. HTML5常见的面试题,基础知识点

                                                                                    HTML5常见的面试题 一.HTML 常 ...

  7. 【面试必备】常见Java面试题大综合

    一.Java基础 1.Arrays.sort实现原理和Collections.sort实现原理答:Collections.sort方法底层会调用Arrays.sort方法,底层实现都是TimeSort ...

  8. PHPer常见的面试题总结

    1.平时喜欢哪些php书籍及博客?CSDN.虎嗅.猎云 2.js闭包是什么? 3.for与foreach哪个更快? 4.php鸟哥是谁?能不能讲一下php执行原理? 5.php加速器有哪些?apc.z ...

  9. 分享一些JVM常见的面试题(转)

    出处:  分享一些JVM常见的面试题 前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 ...

随机推荐

  1. 剑指offer:数组中的逆序对

    题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%100 ...

  2. 从宿主机直接进入docker容器的网络空间

    Docker dns nameserver 也是进入容器网络空间,监听53端口,但它通过iptable把端口映射到宿主机上,处理DNS请求的进程就在宿主机上. how does Docker Embe ...

  3. spring boot eclipse 远程调试

    <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...

  4. java.sql.SQLException: Data truncated for column 'seat_number' at row 1

    项目中try catch 出现这种情况,就去检查下数据库列类型和项目中实体类的id类型是否一致.数据库id是int类型的,项目实体类是String类型的,项目save功能无法保存,导致了我的这个异常.

  5. 并发下sftp连接报错——com.jcraft.jsch.JSchException: connection is closed by foreign host

    当对单接口极限测试时,随着并发量上升,接口稳定性出现不稳定的情况,排查后台日志,发现报错在该接口调用sftp上传时出现问题(确切的是在初始化连接时失败) 原因:系统SSH终端连接数配置过小,查看虚拟机 ...

  6. 某表中字段值存在多个Gid逗号分开 取值拆分每个gid SQL多个逗号隔开的取值

    存在值信息 表值函数实现: --实现split功能 的函数 拆分 逗号分开的多个值 ),)) )) as begin declare @i int set @SourceSql=rtrim(ltrim ...

  7. exports module.exports export export default之间的关系

    exports 和module.exports是CommonJS模块规范 export export default是ES6模块的规范,两者完全是不同的概念. node应用由模块组成,采用的是Comm ...

  8. Python进阶之面向对象

    新式类与旧式类 区别: 在2.2版本之前所有的类都是旧式类,3.x版本已取消旧式类 旧式类一般的写法,不继承任何父类 class Person: def __init__(self, name): s ...

  9. 【视频开发】【Live555】通过live555实现H264 RTSP直播

    前面的文章中介绍了<H264视频通过RTMP流直播>,下面将介绍一下如何将H264实时视频通过RTSP直播. 实现思路是将视频流发送给live555, 由live555来实现H264数据流 ...

  10. pymysql DAO简单封装

    #!/usr/bin/env python # -*-coding:utf-8 -*- # # 无法执行多个query,self.conn.close()放在CdbConn类的单独函数中,每次quer ...