前端面试题-CSS篇(一)
一、盒子模型
标准盒子模型:
标准盒子模型:宽度 = 内容的宽度(content) + border + padding + margin
IE盒子模型:
宽度 = 内容宽度(content + border + padding) + margin
盒模型:内容(content)、填充(padding)、边界(margin)、边框(border)。
1、页面渲染时,dom元素所采用的布局模型,可通过box-sizing进行设置。根据计算宽高的区域可分为:
content-box (W3C标准盒模型)
border-box (IE盒模型)
padding-box (FireFox 曾经支持)
margin-box (浏览器未实现)
123456.div{ box-sizing: content-box;}.div{ box-sizing: border-box;}
二、居中方法1、水平居中text-align: center;
只针对行内元素。对于元素中的块级元素它是不起作用的。
123.text_d ...
459. 重复的子字符串
题目点击前往
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
123输入: s = "abab"输出: true解释: 可由子串 "ab" 重复两次构成。
示例 2:
12输入: s = "aba"输出: false
示例 3:
123输入: s = "abcabcabcabc"输出: true解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
解题思路
使用KMP算法。
next 数组记录的是最长相同前后缀,如果 next[len - 1] != -1,则说明字符串有最长相同的前后缀。
最长相等前后缀的长度为:next[len - 1]。
数组长度减去最长相同前后缀的长度相当于是第一个周期的长度,也就是一个周期的长度,如果这个周期可以被整除,就说明整个数组就是这个周期的循环。
123456789101112131415161718192021222324252627/** * @p ...
28. 实现 strStr()
题目点击前往
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
示例 1:
12输入:haystack = "hello", needle = "ll"输出:2
示例 2:
12输入:haystack = "aaaaa", needle = "bba"输出:-1
示例 3:
12输入:haystack = "", needle = ""输出:0
解题思路
利用哈希表。
首先将数组中每个字符串按字母组成由大到小进行排序并保存在新的数组中,保证原数组与新数组元素索 ...
剑指 Offer 58 - II. 左旋转字符串
题目点击前往
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串”abcdefg”和数字2,该函数将返回左旋转两位得到的结果”cdefgab”。
示例1:
12输入: s = "abcdefg", k = 2输出: "cdefgab"
解题思路
局部翻转+整体翻转;
先翻转0-n位置元素,再翻转n-len位置元素,最后整体翻转。
1234567891011121314151617181920/** * @param {string} s * @param {number} n * @return {string} */var reverseLeftWords = function(s, n) { let strArr = Array.from(s); reverse(strArr, 0, n-1); reverse(strArr, n, strArr.length-1); rev ...
151. 翻转字符串里的单词
题目点击前往
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。说明: * 输入字符串 s 可以在前面、后面或者单词间包含多余的空格。 * 翻转后单词间应当仅用一个空格分隔。 * 翻转后的字符串中不应包含额外的空格。
示例1:
12输入:s = "the sky is blue"输出:"blue is sky the"
示例2:
123输入:s = " hello world "输出:"world hello"解释:输入字符串可以在前面或者后面包含多余的空格,但是翻转后的字符不能包括。
解题思路
方法一:调用库函数直接操作。
方法二:自定义函数。
自定义函数创建去空格函数
依题意需要去除的空格类型包括:
字符串开头结尾的空格;
连续空格只保留一个。
这里利用双指针法:
fast指针走得快,slow指针走得慢;
当fast指针遇到空格 ...
剑指 Offer 05. 替换空格
题目点击前往
请实现一个函数,把字符串 s 中的每个空格替换成”%20”。
示例1:
12输入:s = "We are happy."输出:"We%20are%20happy."
解题思路双指针法
将字符串转换为数组,查询空格的个数;由于一个空格将会被三个字符给替换,所以此时需要将数组的长度扩大。
然后利用双指针从后往前进行查找替换:
左指针每遇到一个空格就需要将右指针接下来三个位置换成指定内容;反之将右指针内容替换为左指针。
1234567891011121314151617181920212223242526/** * @param {string} s * @return {string} */var replaceSpace = function(s) { let arr = Array.from(s); let count = 0; arr.forEach(e=>{ if(e === " "){ ...
541. 反转字符串 II
题目点击前往
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例1:
12输入:s = "abcdefg", k = 2输出:"bacdfeg"
示例2:
12输入:s = "abcd", k = 2输出:"bacd"
解题思路双指针法12345678910111213141516/** * @param {string} s * @param {number} k * @return {string} */var reverseStr = function(s, k) { let arr = s.split(''); let len = arr.length; for(let i = ...
344. 反转字符串
题目点击前往
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例1:
12输入:s = ["h","e","l","l","o"]输出:["o","l","l","e","h"]
示例2:
12输入:s = ["H","a","n","n","a","h"]输出:["h","a","n","n","a","H"]
解题思路reverse()方法1234567/** * @param {character[ ...
15. 三数之和
题目点击前往
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例1:
12输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]
示例2:
12输入:nums = []输出:[]
示例3:
12输入:nums = [0]输出:[]
解题思路
拿这个nums数组来举例,首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left 定义在i+1的位置上,定义下标right 在数组结尾的位置上。
依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i] b = nums[left] c = nums[right]。
接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动 ...
454. 四数相加 II
题目点击前往
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
示例1:
123456输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]输出:2解释:两个元组如下:1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 02. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
示例2:
12输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]输出:1
解题思路
双层循 ...