web前端开发自学难吗,CSS颜色基本样式

article/2025/8/27 2:52:53

字节跳动算法题

链表

面试题:反转单向链表

题目需要将一个单向链表反转。思路很简单,使用三个变量分别表示当前节点和当前节点的前后节点,虽然这题很简单,但是却是一道常考题

以下是实现该算法的代码

var reverseList = function(head) {// 判断下变量边界问题if (!head || !head.next) return head// 初始设置为空,因为第一个节点反转后就是尾部,尾部节点指向 nulllet pre = nulllet current = headlet next// 判断当前节点是否为空// 不为空就先获取当前节点的下一节点// 然后把当前节点的 next 设为上一个节点// 然后把 current 设为下一个节点,pre 设为当前节点while(current) {next = current.nextcurrent.next = prepre = currentcurrent = next}return pre
};

二叉树遍历

  • 原理: 递归
function traversal(node,tempOrderTraversal) {
if (node != null) {// tempOrderTraversal.push(node.value) 前序遍历if (node.left != null) {preOrderTraversal(node.left,tempOrderTraversal)}// tempOrderTraversal.push(node.value) 中序遍历if (node.right != null) {preOrderTraversal(node.right,tempOrderTraversal)}// tempOrderTraversal.push(node.value) 后序遍历}}

不能使用递归时,则使用栈就是JS的数组push、pop

// 非递归遍历
var kthSmallest = function(root, k) {
const tempArr = [];
let result;
tempArr.push(root);
while (tempArr.length > 0) {result = tempArr.pop();if (result.value == k) break;if (result.left != null) tempArr.push(result.left);if (result.right != null) tempArr.push(result.right);
}
return result;
};

按位操作

1)按位与
每一位都为 1,结果才为 1

8 & 7 // -> 0
// 1000 & 0111 -> 0000 -> 0

2)按位或
其中一位为 1,结果就是 1

8 | 7 // -> 15
// 1000 | 0111 -> 1111 -> 15

3)按位异或
每一位都不同,结果才为 1

8 ^ 7 // -> 15
8 ^ 8 // -> 0
// 1000 ^ 0111 -> 1111 -> 15
// 1000 ^ 1000 -> 0000 -> 0

从以上代码中可以发现按位异或就是不进位加法

面试题:两个数不使用四则运算得出和

这道题中可以按位异或,因为按位异或就是不进位加法, 8 ^ 8 = 0 如果进位了,就是 16 了,所以我们只需要将两个数进行异或操作,然后进位。那么也就是说两个二进制都是 1 的位置,左边应该有一个进位 1,所以可以得出以下公式 a + b = (a ^ b) + ((a & b) << 1) ,然后通过迭代的方式模拟加法

function sum(a, b) {if (a == 0) return bif (b == 0) return alet newA = a ^ blet newB = (a & b) << 1return sum(newA, newB)
}

堆排序

堆排序利用了二叉堆的特性来做,二叉堆通常用数组表示,并且二叉堆是一颗完全二叉树(所有叶节点(最底层的节点)都是从左往右顺序排序,并且其他层的节点都是满的)。二叉堆又分为大根堆与小根堆。

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

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

  1. 首先遍历数组,判断该节点的父节点是否比他小,如果小就交换位置并继续判断,直到他的父节点
    比他大
  2. 重新以上操作 1,直到数组首位是最大值
  3. 然后将首位和末尾交换位置并将数组长度减一,表示数组末尾已是最大值,不需要再比较大小
  4. 对比左右节点哪个大,然后记住大的节点的索引并且和父节点对比大小,如果子节点大就交换位置
  5. 重复以上操作 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 0return 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;
}

最后

篇幅有限,文章中的前端初阶笔记,学习路线图,和前端面试题都可以点击这里免费领取完整版PDF(含答案解析)。

《2021年前端面试题精选大全》内容大纲包括HTML,CSS,JavaScript,jQuery,浏览器,HTTP,React,小程序

【2021年前端面试题精选大全】

p;
}

#### 最后**篇幅有限,文章中的前端初阶笔记,学习路线图,和前端面试题都可以[点击这里免费领取](https://gitee.com/vip204888/web-p7)完整版PDF(含答案解析)。**>**《2021年前端面试题精选大全》**内容大纲包括**HTML,CSS,JavaScript,jQuery,浏览器,HTTP,React,小程序**[外链图片转存中...(img-2j5eb8tL-1627014347795)]

http://chatgpt.dhexx.cn/article/iBxyOX5q.shtml

相关文章

CSS的浮动属性,终获offer

前言 最近在准备面试&#xff0c;然后复习下之前写过的项目&#xff0c;书籍&#xff0c;笔记&#xff0c;文章。一看很多知识点都没有印象&#xff0c;最可拍的是连自己为了防止忘记写的文章竟然都感觉不是自己写的。有些开始怀疑人生了。 好了&#xff0c;废话少说&#xf…

CSS介绍,这些知识你必须拿下

前言 跳槽&#xff0c;这在 IT 互联网圈是非常普遍的&#xff0c;也是让自己升职加薪&#xff0c;走上人生巅峰的重要方式。那么作为一个普通的Android程序猿&#xff0c;我们如何才能斩获大厂offer 呢&#xff1f; 疫情向好、面试在即&#xff0c;还在迷茫踌躇中的后浪们&…

web开发在线培训,CSS浮动实战

一、简历的准备 简历制作是很重要的一个环节,一份好的简历会给面试官留下很不错的印象,也有助于你顺利通过简历筛选环节。 个人基本信息:主要是姓名,联系方式,邮箱,学历等;技术技能:对了解、熟练掌握、精通这类词有概念,不要随便用精通;因为面试官一般会根据简历内容…

CSS浮动实战,你还看不明白?

一、简历的准备 简历制作是很重要的一个环节,一份好的简历会给面试官留下很不错的印象,也有助于你顺利通过简历筛选环节。 个人基本信息:主要是姓名,联系方式,邮箱,学历等;技术技能:对了解、熟练掌握、精通这类词有概念,不要随便用精通;因为面试官一般会根据简历内容…

web设计与开发,CSS块元素

一、简历的准备 简历制作是很重要的一个环节&#xff0c;一份好的简历会给面试官留下很不错的印象&#xff0c;也有助于你顺利通过简历筛选环节。 个人基本信息&#xff1a;主要是姓名&#xff0c;联系方式&#xff0c;邮箱&#xff0c;学历等&#xff1b;技术技能&#xff1…

CSS介绍,含面试题+答案

前言 正式学习前端大概 3 年多了&#xff0c;接触前端大概 4 年了&#xff0c;很早就想整理这个书单了&#xff0c;因为常常会有朋友问&#xff0c;前端该如何学习&#xff0c;学习前端该看哪些书&#xff0c;我就讲讲我学习的道路中看的一些书&#xff0c;虽然整理的书不多&a…

CSS全局样式,帮你突破瓶颈

一、简历的准备 简历制作是很重要的一个环节,一份好的简历会给面试官留下很不错的印象,也有助于你顺利通过简历筛选环节。 个人基本信息:主要是姓名,联系方式,邮箱,学历等;技术技能:对了解、熟练掌握、精通这类词有概念,不要随便用精通;因为面试官一般会根据简历内容…

前端笔试错题总结

目录 题目分类HTMLinput的type属性如下&#xff1a; CSSJS算法操作系统计算机网络数据结构完全二叉树哈夫曼树二叉排序树大根堆 小根堆线性探查解决hash冲突 数据库浏览器 题目分类 HTMLCSSJS数据库算法操作系统计算机网络数据结构浏览器 HTML input的type属性如下&#xff…

图像处理之灰度变换

灰度变换 空间域增强空间域增强的特点线性变换分段线性变换非线性变换非线性变换图像前后灰度值关系直方图均衡 空间域增强 直接对构成图像的像素的灰度级的操作 输入图像 x ( j , i ) − − − > y ( j , i ) x(j, i)---> y(j, i) x(j,i)−−−>y(j,i) y ( j , i …

python图像处理之图像灰度化

灰度化 预备知识 在了解图像处理的基本操作之前&#xff0c;我们需要知道关于图像的一些基本知识。我们这里所说的图像处理实质上是数字图像处理&#xff0c;因为计算机只能对数字信号进行处理&#xff0c;因此存储在计算机中的图像都是实际图像经过离散化处理之后得到的。 图…

MATLAB图像灰度化—优化三种灰度化算法

一、彩色、灰度、二值、索引图像 彩色图像&#xff1a;每个像素由R、G、B三个分量表示&#xff0c;每个通道取值范围0~255。数据类型一般为8位无符号整形unit8。&#xff08;通常我们认为一个彩色图像是由三页组成的&#xff0c;分别是R、G、B&#xff0c;每一页都是一个二维矩…

图像灰度化的三种方式

目录 一、为什么要图像灰度化 二、灰度化的主要方法 2.1取通道最大值 2.2平均值法 2.3加权法 三、示例 一、为什么要图像灰度化 目前很多的图像算法都是基于灰度图像的&#xff0c;比如特征点提取&#xff0c;特征点匹配等。 二、灰度化的主要方法 2.1取通道最大值 使用…

Matlab实现图像灰度化算法

Matlab实现图像灰度化算法 灰度化算法原理代码实现 灰度化算法原理 RGB应该都听说过&#xff0c;我们一般看到的彩色图像嘛&#xff0c;R、G、B分别对应了三原色&#xff1a;红色&#xff08;red&#xff09;、绿色&#xff08;green&#xff09;和蓝色&#xff08;blue&#…

彩色图像灰度化

灰度图像能以较少的数据表征图像的大部分特征&#xff0c;因此在某些算法的预处理阶段需要进行彩色图像灰度化&#xff0c;以提高算法的效率。将彩色图像转化为灰度图像的过程称为彩色图像灰度化。 常用RGB图像灰度化&#xff0c;在RGB模型中&#xff0c;位于空间位置(x,y)的像…

数字图像处理(入门篇)三 灰度化

目录 1 灰度化 2 灰度化的意义&#xff1f; 3 灰度化方法 &#xff08;1&#xff09;最大值法 &#xff08;2&#xff09;平均值法 &#xff08;3&#xff09;加权平均值法 5 效果图 6 结论 1 灰度化 灰度化&#xff1a;将多通道的彩色图像转换为单通道的灰度图像的过…

图像处理时为什么灰度化

发一个初级知识哦 先前在为大家介绍图像识别技术时&#xff0c;在图像预处理部分提到了灰度化&#xff0c;大家可能会产生疑惑&#xff1a;为什么做图片识别要将彩色图像灰度化呢&#xff1f; 正式解释这个问题之前&#xff0c;我们需要了解&#xff0c;什么是灰度化&#xff…

[Python从零到壹] 四十三.图像增强及运算篇之图像点运算和图像灰度化处理

欢迎大家来到“Python从零到壹”&#xff0c;在这里我将分享约200篇Python系列文章&#xff0c;带大家一起去学习和玩耍&#xff0c;看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解&#xff0c;真心想把自己近十年的编程经验分享给大家&#xff0c;希望…

图像处理灰度变换

1 灰度变换简介 灰度变换是对图像的每个像素按照灰度映射函数进行映射的变换&#xff0c;其作用于每个像素。灰度变换一般用来进行图像增强&#xff0c;提高图像的对比度&#xff0c;改善图像的灰度分布等。灰度变换根据灰度变换函数的不同分为线性函数变换、对数函数和幂函数变…

数字图像处理(五)图像灰度化处理

1.图像灰度化 灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度, 范围一般从0到255 ,白色为255 ,黑色为0。所谓灰度值是指色彩的浓淡程度,灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该灰度值的象素数。 灰度就是没有色彩, RGB色彩分量全部相等…

【图像处理】灰度化

图像灰度化就是图像中的每一像素点的分量都满足RGBV的关系&#xff0c;此时的V就是灰度值 为什么要灰度化&#xff1f; 灰度是指含有亮度信息&#xff0c;不含彩色信息的图像。 使用灰度图的好处&#xff1a; 1、RGB的值都一样 2、图像数据 调色板索引值 RGB的值 亮度值…