真的就是体验感拉满。只有三道算法题,然后每道题都不难,都能做出来一部分,但是如果想ak的话还是需要很高的水平。而且题目都是基于js出的,真的感受到了是为前端出的卷子,不像其他公司:选择填空出后端题,或者干脆就后端前端一起做一样的算法题... 这次笔试里两道题目限制了语言是js,一题没限制,题目又说了要js。感觉不是同个人出的卷子。
做完之后感觉自己基础还是太差了,而且之前做题都是随遇而安,觉得自己做出来了就行,没想过在题目基础上对时间跟空间复杂度更进一步要求。而且自己题目刷太少了...
题目上写了要求只用js,不过答题的时候可以选择其他的语言。提交到力扣后更新了代码 现在可以100%过了...
输入:A:"123",B:"123"
输出:"246"
输入跟输出都是字符串 应该是怕数字太大溢出了
思路:用数组来做,数组的容量比数字的安全位数大。先把AB切成数组,然后把长的那个部分(A跟B长度可能不一样,不知道测试用例里有没有这样的,不过我是先考虑到了这点)加到res中。然后再从0位开始遍历数组,每次让temp=两个数组当前的和。如果大于10,就从尾部遍历res(具体逻辑看代码),小于10直接加入res尾部。
res中存的尽量是number类型的值 如果是string类型 拿出来的时候还得转。
function bigIntAdd( n1 , n2 ) { // write code here n1 = n1.split("") n2 = n2.split("") let res = [] while(n1.length!=n2.length){ if(n1.length>n2.length){ res.push(parseInt(n1.shift())) }else{ res.push(parseInt(n2.shift())) } } // n1.length==n2.length // res[number] for(let i=0;i<n1.length;i++){ let temp = parseInt(n1[i])+parseInt(n2[i]) if(temp>=10){ // temp==10 if(res.length==0){ res.push(1) res.push(temp%10) }else{ for(let j=res.length-1;j>=0;j--){ let now = res[j]+1 if(now>=10){ if(j==0){ // 极端情况 res.unshift(1) res[j+1] = (now)%10 res.push(temp%10) break; }else{ res[j] = (now)%10 continue; } }else{ res[j] = now res.push(temp%10) break; } } } }else{ res.push(temp) } } return res.join("") }
顾名思义 除本身外的数组其他数的乘积。看输入输出就知道意思。这个题有两个提升点,应该分别代表了不同的通过用例把。
限制语言js跟ts
输入:[1,2,3,4] 输出[24,12,8,6]
思路:只想到了用数组的map方法,复杂度太高。不如力扣方法
var constructArr = function (arr) { let res = []; let tmp = 1; for (let index = 0; index < arr.length; index++) { res[index] = tmp; tmp *= arr[index]; } tmp = 1; for (let index = arr.length - 1; index >= 0; index--) { res[index] *= tmp; tmp *= arr[index]; } return res; };
两个正序数组n和m 求出中位数。要求时间复杂度O(log(m+n))
输入:[1,3],[2] 输出:[2]
思路:合并之后排序后取中间。感觉正确解法应该不是这样,应该是用分治。不过我随便写了下居然全过了,就懒得改了T.T 懒狗一枚了属于是。
function findMedianSortedArrays( nums1 , nums2 ) { // write code here let temp = nums1.concat(nums2).sort() return temp.length%2===0?(temp(temp.length/2)+temp(temp.length/2 -1))/2:temp[Math.floor(temp.length/2)] }#Lazada校招##阿里lazada##笔试#