JS面试题之——数组转置与螺旋矩阵

JS面试题之——数组转置与螺旋矩阵,第1张

输入 :一个二维数组,例如:

    [ [1,2,3] , [4,5,6] , [7,8,9] ]

输出 :二维数组的转置

    [ [1,4,7] , [2,5,8] , [3,6,9] ]

    矩阵的转置就是行列互换

function arrayT(sArray){

    var tArray = [];

    //对目标数组初始化

    for(var i = 0; i < sArray[0]length; i++){

        tArray[i] = [];

    }

    //转置数组

    for(var i = 0; i < sArraylength; i++){

        for(var j = 0; j < sArray[i]length; j++){

            tArray[j][i] = sArray[i][j];

        }

    }

    return tArray;

}

注:

    这是一道本人经历的面试题,题目要求是给一个字符串,"abc def ghi",输出为"adg beh cfi"。

    通过这个面试题,我想到了数组的转置 *** 作。

该题是在数组转置的基础上,我想到了之前leetcode上的一道题目,就重温一下。

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

输入:

[

    [ 1 , 2 , 3 ] ,

    [ 4 , 5 , 6 ] ,

    [ 7 , 8 , 9 ]

]

输出:

[ 1 , 2 , 3 , 6 , 9 , 8 , 7 , 4 , 5]

其实是相当于每次遍历完外圈,然后遍历内圈;

我们可以把遍历每一圈作为一个完整的事件,然后不断去重复遍历每一圈就可以解决这个问题。

其实就是递归的运用。

arr => {

    // map函数用来完成当前矩阵最外一圈的遍历

    // 二维数组 arr 表示当前矩阵

    // 一维数组 result 用来保存遍历结果 

    let map = (arr, result) => {

        // 矩阵的高度即行数

        let n = arrlength

        // 遍历矩阵的每一行

        for(let i = 0; i < n; i++){

            // 若第一行 按顺序插入

            if(i === 0){

                result = resultconcat(arr[i])

            } else if (i === n-1){

                // 若最后一行 倒序插入

                result = resultconcat(arr[i]reverse())

            } else {

                // 若中间行 插入该行最后一个元素 并将该元素从矩阵中删除

                resultpush(arr[i]pop())

            }

        }

        // 将已经遍历的第一行和最后一行从矩阵中删除

        arrpop()

        arrshift()

        // 遍历插入最左侧一列 此时删除首位两行后矩阵高度已变为n-2

        for(let j = n - 3; j >= 0; j--){

            // 避免arr[j]长度为空时插入undefined

            if(arr[j]length){

                resultpush(arr[j]shift())

            }

        }

        // 截止条件 矩阵有元素就继续递归

        if(arrlength){

            // 把已将遍历元素删除的矩阵进行递归

            return map(arr, result)

        }else{

            return result

        }

    }

    // 将初始矩阵传入, 保存结果的数组初始为空

    return map(arr, [])

}

原始数据:数组中有三个关于的对象数据

需求:需要根据评分(rating)的高低,按倒序排列,即评分越高,越靠前

错误示范一:

个人想法:把当前值赋给下一个值,再把下一个值赋给当前值,理论上来说没问题的。但是

结果:

错误示范二:

结果:评分都覆盖了,变为一组数据了

正确示范一:

结果:

正确示范二(es6解构赋值写法):

结果:

正确示范三:sort排序(注意这样是返回的新数组,而不是修改原数组)

返回值是负数,意味着不交换位置,返回值是正数交换位置,0的话,值是相等的,也就不存在交换一说了

结果:

正确示范四:sort排序(注意这样是返回的新数组,而不是修改原数组)

直接返回a-b的结果,a大于b,即返回正数交换,a小于b,即返回负数不交换,这样得到的数据是反的,即分数越高,排名越靠后,通过翻转得到正确的数据

或者返回b-a的结果就是正确的

结果:

如上就是根据需求交换数组数据实现排序的方法。

如有问题,请指出,接受批评。

在Js Array中的方法大致分为两类:方法改变原数组 & 方法生成新数组(不改变原数组)

1push():向原数组的最后一位添加一个元素。返回数组长度
2unshift():向原数组的最前添加一个元素。返回数组长度
3pop():截取数组中最后一个元素。返回被截取的元素
4shift():截取数组中第一个元素。返回被截取的元素
以上四个方法可以放在一起记忆,不要被方面名所误导。
5splice():splice(index, howmany, item1,itemX) 方法有多个参数可选,常用于分割数组。返回处理后的数组
第一个参数:从第n个元素的下标开始截取;
第二个参数:从第n个元素的下标开始截取多少个元素;
第三到n个参数:将截取的元素替换为什么
6sort():sort(fn) 方法有一个参数可选,用于给数组排序。在不写参数的情况下会对数组中的元素进行从小到大的顺序排序。但不会识别数字(按照数字ACSLL编码表进行排序)
可选参数:参数返回一个函数,这个函数中有两个形参 sort(function(a, b){}) 。形参中的a和b会类冒泡的访问数组中的元素;例:[1, 2, 3, 4] a b 分别会选择 1,2、 1,3 、 1,4 、 2,3 、 2,4 、 3,4。当a-b>1时,交换ab的值;当a-b<1时,不动。由此,可在此函数体中写出自定义的排序规则。返回排序后的数组

7reverse():倒序排列整个数组。返回数组

1concat():concat(arr)将两个数组拼接在一起。返回新数组
2join():join('str')一个可选参数,返回以一个字符串将数组中的元素拼接成字符串。与str的split('str')方法相反,split()是将字符串以一个字符串拆分成数组。
3toString():与join()函数不填写参数一样,返回一个一 逗号 ,拼接的字符串。
4slice():选取数组中的第n个元素到第n个元素。返回新数组,也可不写参数返回数组的副本。
5indexOf():index(item, start)方法有两个参数。返回指定元素在数组中的索引值;如果未找到指定元素,返回 -1
第一个参数:指定的元素
第二个参数:从填入的索引开始寻找

数组转换字符串

arrayjoin()    // 将数组的值拼接成字符串。

var arr = [1,2,3,4,5]

arrjoin()   // 不传参数,默认按,进行拼接

arrjoin("-")  // 参数是字符串类型 按-进行拼接

数组的增删 *** 作

arraypush(value,[value[,]])   //将一个或多个元素添加到数组的结尾,并返回新的长度。

arraypop()   //从数组中删除最后一个元素,并返回该元素的值,改变了数组的长度

arrayunshift(value,[value[,]])   //将一个或多个元素添加到数组的开头,并返回新的长度。

arrayshift()    //从数组中删除第一个元素,并返回该元素的值,改变了数组的长度

数组的翻转与排序

arrayreverse()    // 翻转数组,返回翻转过的数组

arraysort()    // 默认排序顺序是根据字符串Unicode码点,比如如果是数字的话,排序结果是10小于2,因为比较的是第一位

var arr = [1,3,10,2,4,40,5]

arrsort()    // [1, 10, 2, 3, 4, 40, 5]

// sort方法可以传递一个函数作为参数,这个参数用来控制数组如何进行排序

var arr = [1,2,10,4,40,5]

arrsort(function(a,b)

    return a-b;  //按照正序

    return b-a //按照倒序

})

数组的拼接与截取

concat:数组合并,不会影响原来的数组,会返回一个新数组。

var arr = [1,2,3]

var arr1 = ["a","b","c"]

var newArray = arrconcat(arr1)    //[1,2,3,"a","b","c"];

slice:复制数组的一部分到一个新数组,并返回这个新数组,原来的数组不受影响,包含头,不包含尾

var newArray = arrayslice(begin, end)

var arr = [1,2,3,4,5]

arrslice(0,3) //[1,2,3]

arrslice(-3,-1) //[3,4]

splice: 以新元素来替换旧元素,以此来修改数组的内容,返回被替换的内容,原数组被改变

start:开始位置  deleteCount:删除的个数  items:替换的内容

arraysplice(start, deleteCount, [items[,items])

var arr = [1,2,3,4,5]

var newArray = arrsplice(0,3,"a","b","c","d")

consolelog(newArray)    //[1, 2, 3]

consolelog(arr)    // ["a", "b", "c", "d", 4, 5]

数组查找元素

indexOf方法用来查找数组中某个元素第一次出现的位置,如果找不到,返回-1

arrayindexOf(search, [fromIndex])

lastIndexOf()从后面开始查找数组中元素第一次出现位置,如果找不到,返回-1 

arraylastIndexOf(search, [fromIndex])
链接:>(水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数。水仙花数是指一个3位数,它的每个位上的数字的3次幂之和等于它本身 例如: 1~3 + 5~3 + 3~3 =153)

(质数就是在大于1的自然数中,除了1和它本身以外不在有其他因数的自然数)

a:11,b:10

A [] B [""] C [undefined] D [null]

A ['false'] B [false] C[0] D[]

A null B undefined C “hello” D“world”

A "llowo" B "llow" C "llo" D null

A "llowo" B "llow" C "llo" D null

A getYear()
B getMonth()
C getDay()
DgetDate()

A 基于对象
B 移动端优先
C 事件驱动
D 跨平台

A String
B Float
C Number
D Null

A 任意单个字符
B 任意单个字母
C 任意单个字母、数字、下划线
D 任意单个字母、数学、下划线、$符号

A <javascript>
B <script>
C <scripting>
D <js>

A var s = 'heloe'
B var n = 20
C var x = documentgetElementsByTagName('box')
D var y = documentquerySelectorAll('ul li')

A documentcreateElement
B documentcreateTextNode
C documentgetElementById
B documentquerySelector

A eleinnerText
B eleinnerHTML
C eletextContent
D elehtmlContent

插入排序的算法描述的是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到对应位置并插入

A对数组里数据的排序可以用sort函数,如果排序效果非预期,可以给sort函数加一个排序的参数
Breverse用于对数组数据的倒序排列
C向数组的最后位置加一个新元素,可以用pop方法
Dunshift方法用于向数组删除第一个元素

Awindowstatus = "已经选中该文本框"
Bdocumentstatus = '已经选中该文本框'
Cwindowscreen = '已经选中该文本框'
Ddocumentscreen = '已经选中该文本框'

A <input type="button" value="new" onclick="open('newhtml','_blank')" />
B <input type="button" value="new" onclick="windowlocation = 'newhtml'" />
C<input type="button" value="new " onclick = "locationassign('newhtml)">
D <form target = "_blank" action="newhtml">
<input type="submit" value="new" />
</form>

A<script type="text/javascript">documentwrite(<h1>hello</h1>)</script>
B<script type="text/javascript">documentwrite("<h1>hello</h1>")</script>
C<script type="text/javascript"><h1>hello</h1></script>
D<h1><script type="text/javascript">documentwrite("hello")</script></h1>

以下说法中正确的是(AD)
A在页面的第二个文本框中输入内容后,当目标离开第二个文本框时,第一个文本框的内容不变
B在页面的第一个文本框中输入内容后,当鼠标离开第一个文本框时,将在第二个文本框中复制第一个文本框的内容
C在页面的第二个文本框中输入内容后,当鼠标离开第二个文本框时候,将在第一个文本框中复制第二个文本框的内容
D在页面的第一个文本框中输入内容后,当鼠标离开第一个文本框时,第二个文本框的内容不变


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/10548534.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-09
下一篇2023-05-09

发表评论

登录后才能评论

评论列表(0条)

    保存