首页 > 编程知识 正文

字节面试没过下次还能面吗,字节面试体验调查,是不是凉了

时间:2023-05-04 00:08:46 阅读:169863 作者:2977

前几天博主刚去面试字节跳动,面试官就问了几个算法问题。 记录下来并整理成文件。 去面试之前,我听说字节跳动的面试很喜欢算法问题。 基本上在技术方面有算法问题,很难。

去大工厂面试的合伙人可以采用一波。

拒绝了白妓女,客人还记得称赞说:“太棒了…啊~~~”。 在这里占了一个洞

趁着年轻,我还得再生活几年。 我要么毁灭,要么我铸造辉煌。 如果有一天你发现我在平庸面前低头了,就朝我开炮吧。 《在路上》

字节跳动问题链表面问题:反向链表

主题需要反转单向链表。 思路很简单,用三个变量分别表示当前节点和当前节点前后的节点。 这道题很简单,但只是普通的考题

以下是实现该算法的代码

varreverselist=function(head )//判断下变量边界问题if (! 头| |! head.next(returnhead//最初设置为空。 因为第一个节点反转的话会成为末尾。 尾部节点为nulletpre=nulletcurrent=headletnext//要判断当前节点是否为空,首先获取当前节点的下一个节点//将当前节点的next作为上一个节点//然后current pre是当前节点while(current ) next=current.next current.next=prep re=current current=next ) returnpre ); 二叉树的扫描原理:递归functiontraversal(node,tempOrderTraversal ) if ) node!=在空值(//tempordertraversal.push ) node.value )之前遍历if(node.left )!=null (按preorder traversal (node.left,tempOrderTraversal )/tempordertraversal.push (node.value )顺序if )节点tempOrderTraversal )/tempordertraversal.push (node.value )后的遍历) }不可用

//非递归varkthsmallest=function(root,k ) {const tempArr=[]; let result; temparr.push(root; while(temparr.length0) { result=tempArr.pop; if(result.value==k ) break; if(result.left!=null ) Temparr.push(result.left ); if(result.right!=空值(temparr.push (result.right ) ); }return result; (; 位操作1)按位与

两者都是1,结果是1

8//-0//10000111-0000-0http://www.Sina.com /

其中一个是1,结果是1

8|7//-15//1000|0111-1111-153358 www.Sina.com /

每个人都不一样,结果得了1

从8 ^7//- 158 ^8//-0//1000 ^ 0111-1111-15//1000 ^ 1000-0000-0或以上代码可知,逐位异或是无进位加法

问题:两个数不使用四则运算求和

在这个问题中,可以取逐位的异或。 因为每个位的异或是不进位的加法,所以8 ^ 8=0进位后就是16。 因此,只需对两个数进行异或操作并进位。 那么,由于二进制数都应该在1的位置,且在左边有进位1,所以可以得到以下的式a b=(a^b ) ) ab )1),并通过重复方式模拟加法

functionsum(a,b ) ) if ) a==0) returnbif ) b==0) returnaletnewB=a^bletnewB=) ab )1returnsum ) newa,newb ) 二叉堆通常用数组表示,二叉堆是完整的二叉树。 (所有叶节点(最底层节点)按从左到右的顺序排序,其他层的节点已满。)。 二叉山又可以分了

大根堆与小根堆。

大根堆是某个节点的所有子节点的值都比他小小根堆是某个节点的所有子节点的值都比他大

堆排序的原理就是组成一个大根堆或者小根堆。以小根堆为例,某个节点的左边子节点索引是 i * 2 +1 ,右边是 i * 2 + 2 ,父节点是 (i - 1) /2 。

首先遍历数组,判断该节点的父节点是否比他小,如果小就交换位置并继续判断,直到他的父节点
比他大重新以上操作 1,直到数组首位是最大值然后将首位和末尾交换位置并将数组长度减一,表示数组末尾已是最大值,不需要再比较大小对比左右节点哪个大,然后记住大的节点的索引并且和父节点对比大小,如果子节点大就交换位置重复以上操作 3 - 4 直到整个数组都是大根堆。

以下是实现该算法的代码

function heap(array) { checkArray(array); // 将最大值交换到首位 for (let i = 0; i < array.length; i++) { heapInsert(array, i);} let size = array.length; // 交换首位和末尾 swap(array, 0, --size); while (size > 0) { heapify(array, 0, size); swap(array, 0, --size);} return array;}function heapInsert(array, index) { // 如果当前节点比父节点大,就交换 while (array[index] > array[parseInt((index - 1) / 2)]) { swap(array, index, parseInt((index - 1) / 2)); // 将索引变成父节点 index = parseInt((index - 1) / 2);}}function heapify(array, index, size) { let left = index * 2 + 1; while (left < size) { // 判断左右节点大小 let largest = left + 1 < size && array[left] < array[left + 1] ? left + 1 : left; // 判断子节点和父节点大小 largest = array[index] < array[largest] ? largest : index; if (largest === index) break; swap(array, index, largest); index = largest; left = index * 2 + 1;}}

以上代码实现了小根堆,如果需要实现大根堆,只需要把节点对比反一下就好。

树的深度

面试题:树的最大深度

题目需要求出一颗二叉树的最大深度

以下是实现该算法的代码

var maxDepth = function(root) { if (!root) return 0 return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1};

对于该递归函数可以这样理解:一旦没有找到节点就会返回 0,每弹出一次递归函数就会加一,树有三层就会得到3。

快速排序

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

从数列中挑出一个元素,称为 “基准”(pivot);

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

以下是实现该算法的代码

function quickSort(arr, left, right) { var len = arr.length, partitionIndex, left =typeof left !='number' ? 0 : left, right =typeof right !='number' ? len - 1 : right; if (left < right) { partitionIndex = partition(arr, left, right); quickSort(arr, left, partitionIndex-1); quickSort(arr, partitionIndex+1, right); } return arr;}function partition(arr, left ,right) { // 分区操作 var pivot = left, // 设定基准值(pivot) index = pivot + 1; for (var i = index; i <= right; i++) { if (arr[i] < arr[pivot]) { swap(arr, i, index); index++; } } swap(arr, pivot, index - 1); return index-1;}function swap(arr, i, j) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;}

✨面试题文档分享


写在最后

【点击我】即可免费获取web前端面试宝典、知识点、字节跳动真题文档(含解析)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。