青训营真题day01
# 青训营真题
# 题目一:
给定一个十进制整数字符串,判断它是否是 2 的幂。
示例 1 输入:"16",输出:true
示例 2 输入:"101",输出:false
示例 3 输入:"70368744177664",输出:true
限定语言:C、 C++、Java、Python、JavaScript V8
一个数n是2的幂,当且仅当n是正整数,并且n的二进制中包含1个1,因此我们可以考虑使用位运算,将n的二进制表示中最低位的哪个1提取出来,再判断剩余的数值是否为0即可。
n&(n-1)=0n&(-n)=n
负数的存储在计算机中按补码规则存储,按位取反后加一, n&(-n) 的结果为 n 时为 2 的幂
4(100) 16(1 0000)
let isPowerOfTwo = function(n){
return n>0&&(n&(n-1))===0
}
2
3
let isPowerOfTwo = function(n){
return n>0&&(n&-n)===n
}
2
3
如果是给定范围的一个数判断
-2^31 <= n <= 2^31 - 1
只需要判断 n 是否是 2^30 的约数即可
let isPowerOfTwo = function(n){
const BIG = 1<<30
return n>0&&BIG%n === 0
}
2
3
4
自己的题解
var isPowerOfTwo = function(n) {
if(n<1){
return false
}
while(n>1){
if(n%2){
return false
}
n/=2
}
return true
};
2
3
4
5
6
7
8
9
10
11
12
扩展题:
幂为4
方法一:
如果n是4的幂,那么该数也是2的幂且二进制中的1出现在偶数个二进制位上
可以构造一个 mask 整数 ,*mask*=(10101010101010101010101010101010)2
与 n 进行与运算,结果为0表示该数为 4 的幂
let isPowerOfFour = function(n) {
return n > 0 && (n & (n - 1)) === 0 && (n & 0xaaaaaaaa) === 0;
};
2
3
方法二:取模
let isPowerOfFour = function(n) {
return n > 0 && (n & (n - 1)) === 0 && n % 3 === 1;
};
2
3
4的幂,除3取模一定为1
总结:
该题型关键解法,在于找到 n&(n-1)=0 的类似规律
# 题目二:
题目 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略空格、字母的大小写。
示例 输入:"A man, a plan, a canal: Panama",输出:true
限定语言:C、 C++、Java、Python、JavaScript V8
该类题型解法: 直接使用 reverse()自带回文函数、双指针、栈等
此题,首先需要先去除非字母和数字的字符,后将字母全部转化为小写后进行判断
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
let len = s.length
let left = 0 , right = len-1
s = s.toLowerCase()
while(left<right){
if(!isVail(s[left])){
left++
continue
}else if(!isVail(s[right])){
right--
continue
}
if(s[left]==s[right]){
left++
right--
continue
}
return false
}
return true
};
let isVail = function(c){
if(c>='a'&&c<='z'){
return true
}
if(c>='0'&&c<='9'){
return true
}
return false
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
自己题解
力扣上更简洁的写法
var isPalindrome = function(s) {
s=s.replace(/[^a-zA-Z0-9]/g,"").replace(/\s/g,"").toLowerCase();
let i=0,j=s.length-1;
while(i<j){
if(s[i]!=s[j]){
return false;
}
i++;
j--;
}
return true;
};
2
3
4
5
6
7
8
9
10
11
12
注意:
如果使用 reverse() 函数,会改变原有数组,使用 toString() 进行比较
# 题目三:
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
自己的题解,暴力
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
let len = 0;
let rs = '';
for(let i=0;i<=s.length;i++){
for(let j=i+1;j<=s.length;j++){
//暴力解法
let nrs = s.slice(i,j)
if(isHW(nrs)){//如果截取的是回文串
if(nrs.length>len){
len = nrs.length
rs = nrs
}
}
}
}
return rs
};
//判断回文字符串
let isHW = function(s){
for(let i=0,j=s.length-1;i<j;i++,j--){
if(s[i]!==s[j]){
return false
}
}
return true
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
运行效率极差,不学算法碰到类似题目,想破脑袋都想不出啊😭
# 题目四:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
滑动窗口
如果我们依次递增地枚举子串的起始位置,那么子串的结束位置也是递增的。k+1到rk的字符串显然是不重复的,并且少了原本的第k个字符
解法:当字符串不重复时 right ++ ,当字符串重复是 left++ 进入下一个循环
let getMax = function(s){
if(s.length<=1) return s.length
let left = 0, right = 1
let max = 0 , rs=[]
while(right<s.length){
rs = s.slice(left,right)
if(rs.indexOf(s.charAt(right))>-1){
left++//开新循环
continue
}else {
right++
}
max = max > right-left ? max:right-left
}
return max
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 选择题
下列哪些是 HTML5 的新特性 ABCD
A . 语义标签
B . Canvas 绘图
C.
<audio>元素D. 增强型表单
下面可以继承的属性有哪些 ACD
A. font-size
B. background
C. color
D. cursor
对于一条100M的宽带,理论下载速度上限是多少 A
A. 12.5MB/s
B. 100MB/s
C. 10MB/s
D. 10Mb.s
关于 for of 和 for in 的描述,正确的是 A D
A. for in 可以循环普通对象
B. for of 可以循环普通对象
C. 都不可以循环数组
D. 都可以循环数组
关于事件冒泡描述正确的是 A
A. 从元素目标向 document 冒泡
B. 从 document 向目标元素冒泡
C. 从 document 向目标元素冒泡,在从目标元素向 documnet 冒泡
D. 以上都不是
以下哪些 script 标签属性会使脚本有可能在 DOMContentLoaded 事件之后加载 AD
A.
<script async>B.
<script defer>C.
<script type="module">D.
<script type="module" async>以下哪些是 css 块级元素的特性 B D
A . 宽度默认由其中的内容决定
B . 高度默认由其中的内容决定
C . 可以被拆分到多行
D . 可以通过height 属性指定高度
以下关于跨域说法错误的是 A
A.
http://example.com/a.html和https://example.com/b.html是相同的域名,属于同源B. 跨域资源共享规范中规定了除了GET之外的 HTTP 请求,或者搭配某些 MINI 类型的 POST 请求,浏览器需要先发送一个 OPTIONS 请求
C. CSS中通过
@font-face使用字体也会有跨域问题D. Cookie、LocalStorage 和 IndexedDB 都会受到同源策略的限制
下列哪些可以实现浏览器存储数据 ABD
A. cookie
B. localStorage
C. session
D. sessionStorage
对以下代码说法正确的是 A
let arr = [1,2,3,4,5] let arr2 = [1,,3]1
2A. 执行
arr.length= 3 ,此时数组为 [1,2,3]B. 执行
arr[10]= 11 , 此时arr.length为 6C. 执行
delete arr[2],此时arr.length为 4,数组为 [1,2,4,5]D.
arr2.length的长度为 2在 css 选择器当中, 优先级排序正确的是 D
A. id选择器 > 标签选择器 > 类选择器
B. 标签选择器 > 类选择器 > id 选择器
C. 类选择器>标签选择器>id选择器
D. id选择器>类选择器>标签选择器
如以下代码所示,给 body 绑定两个事件后,调用
document.body.click()输出的结果是 Adocument.body.addEventListener('click',()=>{ Promise.resolve().then(()=>{ console.log(1) }) console.log(2) },false) document.body.addEventListener('click',()=>{ Promise.resolve().then(()=>{ console.log(3) }) console.log(4) },false)1
2
3
4
5
6
7
8
9
10
11
12A. 2, 4, 1, 3 B. 2, 1, 4, 3 C. 1, 2, 3, 4 D. 1, 3, 2, 4
浮动会导致页面的非正常显示,以下几种清除浮动的方法,哪个是不推荐使用的 D
A. 在浮动元素末尾添加一个空的标签例如
<div style="clear:both">B. 通过设置父元素
overflow值为hiddenC. 给父元素添加clearfix类
D. 父元素也设置浮动
以下代码运行结果是 D
var f = function (){ console.log("1") } function f(){ console.log("2") } f();1
2
3
4
5
6
7A. undefined B. 报错 C. 2 D. 1
下列说法正确的有哪些 A C
A. visibility:hidden 表示所占据的空间位置仍然存在,仅为视觉上的完全透明
B.display:none 不为被隐藏的对象保留其物理空间
C. visibility:hidden 与 display:none 两者没有本质上的区别
D. visibility:hidden 回流与重绘
若主机甲与主机已建立一条 TCP 链接,最大段长 MSS 为 1KB,往反时间RTT为 2ms,则在不出现拥塞的前提下,拥塞窗口用 8KB 增长到 32KB 所需要的最长时长是 D
A. 4ms B. 8ms C. 24ms D. 48ms
以下对HTML标签的使用,哪些是符合语义的 A C
A. 使用 table 展示表格数据
B. 使用 span 表示按钮
C. 使用 article 展示文章内容
D. 使用 P 标签展示文章标题
包过滤防火墙对数据包的过滤依据不包括哪些 C
A. 源IP地址
B. 源端口号
C. MAC地址
D. 目标IP地址