练习
按位与为0的三元组
给你一个整数数组 nums ,返回其中 按位与三元组 的数目。
按位与三元组 是由下标 (i, j, k) 组成的三元组,并满足下述全部条件:
0 <= i < nums.length
0 <= j < nums.length
0 <= k < nums.length
nums[i] & nums[j] & nums[k] == 0 ,其中 & 表示按位与运算符。
示例 1:
输入:nums = [2,1,3]
输出:12
解释:可以选出如下 i, j, k 三元组:
(i=0, j=0, k=1) : 2 & 2 & 1
(i=0, j=1, k=0) : 2 & 1 & 2
(i=0, j=1, k=1) : 2 & 1 & 1
(i=0, j=1, k=2) : 2 & 1 & 3
(i=0, j=2, k=1) : 2 & 3 & 1
(i=1, j=0, k=0) : 1 & 2 & 2
(i=1, j=0, k=1) : 1 & 2 & 1
(i=1, j=0, k=2) : 1 & 2 & 3
(i=1, j=1, k=0) : 1 & 1 & 2
(i=1, j=2, k=0) : 1 & 3 & 2
(i=2, j=0, k=1) : 3 & 2 & 1
(i=2, j=1, k=0) : 3 & 1 & 2
示例 2:
输入:nums = [0,0,0]
输出:27
提示:
1 <= nums.length <= 1000
0 <= nums[i] < 216
class Solution {
public int countTriplets(int[] nums) {
int[] count=new int[1 << 16];
for (int i:nums) {//将nums任意两个数字与的结果和次数统计
for (int j : nums) {
count[i & j]++;//统计i&j出现的次数
}
}
int res =0;
for (int k : nums) {
//再次遍历k 因为题目设定0 <= nums[i] < 2^16
//所以i&j就只需要遍历2^16次就行了
for (int ij=0;ij<(1 << 16);ij++){
if((k&ij)==0) {
res = res + count[ij];
}
}
}
return res;
}
}
这个困难题 我是真的看懂了
第一次看懂
因为目标很明确 就是nums[i] & nums[j] & nums[k] == 0
条件完成就行了,脑子都不用动 所以我上来就3个for循环
然后超出时间了.....
果然还是需要看大神代码的
然后发现他们都是简化了第三次循环
学到了
思路:
枚举i和j 用数组统计它们的按位与 的结果 i&j出现的次数
然后 再用按位与结果ij 去枚举k 让ij&k==0 最后返回另一个计数器res
(注意1 不用太在乎为什么是ij ,包括i,j,k这些其实都可以全用i或者j或者k来表示,理解就好)
(注意2 只需要完成条件nums[i] & nums[j] & nums[k] == 0就行了 实在不行就想想3个for怎么遍历)
八股
说一下 runnable 和 callable 有什么区别?
runnable开启run方法会返回void
而callable开启call方法可以返回一个值,可以配合future futuretask返回异步执行结果
线程有哪些状态?
创建 就绪 运行 阻塞 死亡
创建就是start开始前 就绪就是start方法开始
运行状态就是run方法开始 阻塞就是sleep wait等方法使用后被调离运行
死亡就是run方法结束或者stop结束 这时start方法也无法再使用
sleep() 和 wait() 有什么区别?
sleep是将线程暂停一段时间后 再次回到就绪队列去运行
而wait就直接将线程放入等待池里,等待notify或者notifyAll调用离开
notify()和 notifyAll()有什么区别?
前者是调离等待池里一个线程
后者是调离全部等待池里的线程
nginx第二天
1.docker没有vim命令
2.使用apt-get命令安装
命令如下:
先执行命令:apt-get update
然后执行:apt-get install vim
docker学习的的开始就发现跟课里面的位置不一样
详细看下面的大佬给的地址
通过官网的查看发现,nginx的html文件的路径在/usr/share/nginx/html中,nginx的配置文件主要在/etc/nginx/nginx.conf中!
直接挂载(PS 不挂载修改文件时有点麻烦 例如用xftp的时候找不到对应的挂载文件)
下次直接用 -V挂载用的
docker run
-p 3344:80
--name mynginx
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d
-v /home/nginx/log:/var/log/nginx
-v /home/nginx/html:/usr/share/nginx/html
-d nginx
docker run -p 3344:80 --name mynginx -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/conf/conf.d:/etc/nginx/conf.d -v /home/nginx/log:/var/log/nginx -v /home/nginx/html:/usr/share/nginx/html -d nginx
如果跟我一样没直接挂载 那就这样
注意mynginx是我自己创建的name
# 将容器nginx.conf文件复制到宿主机
docker cp mynginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp mynginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
# 将容器log文件夹下内容复制到宿主机
docker cp mynginx:/var/log/nginx /home/nginx/log
# 将容器中的html文件夹复制到宿主机
docker cp mynginx:/usr/share/nginx/html /home/nginx/html
结构
conf
用来存放配置文件相关
html
用来存放静态文件的默认目录 html、css等
sbin
nginx的主程序
基本流程
Nginx配置与应用场景
最小配置
worker_processes
worker_processes 1; 默认为1,表示开启一个业务进程
worker_connections
worker_connections 1024; 单个业务进程可接受连接数
include mime.types;
include mime.types; 引入http mime类型
default_type application/octet-stream;
default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。
sendfile on;
sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
未开启sendfile
解释nginx.conf
user nginx; 用什么用户启动nginx
worker_processes auto; 工作的进程个数 例如如果4个cpu核心 可以设置4个 这样充分利用
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;单个业务进程可接受连接数
}
http {
mime.types 类型 文本文档 exe文件 由服务器端来定义 例如图一
include /etc/nginx/mime.types; 将另一个配置文件引用到当前配置文件中
default_type application/octet-stream; 如果不包含在上面的type 就默认执行这个类型
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on; 数据0拷贝 意思是不需要复制拷贝
#tcp_nopush on;
keepalive_timeout 65; 保持连接超时时间
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
default.conf
#虚拟主机vhost 这样设置 每个主机之间互不干扰
server {
listen 80; 监听80端口号
server_name localhost;当前的主机名、域名
eg:www.baidu.com /123/index.html 完整的url
location / {就是 域名后面跟着uri /123/index.html 匹配
root /usr/share/nginx/html; 文件根目录
index index.html index.htm; 默认页名称
}
eg:访问/123/index.html 没有此页面 就被/50x.html覆盖
error_page 500 502 503 504 /50x.html; 报错编码对应页面
location = /50x.html {
root /usr/share/nginx/html;
}
}
图一
虚拟主机
·域名、dns、ip地址的关系
DNS 是关联IP和域名的域名系统,可以将域名映射到IP地址
・浏览器、Nginx与http协议
TCP协议:tcp是一个广泛的浏览器协议,它是以流的形式,进行传递数据的(数据是二进制的)
数据流:相当于一个水龙头,开启之后一直流通,没有关掉的动作
HTTP协议:是一个在TCP之上的协议,它会在里面告诉TCP协议什么时候关掉流,当用户的浏览器和Nginx服务器都遵守和实现了HTTP协议之后,他们之间就可以进行信息的交流、传递了。
HTTPS协议:HTTP之上的一个协议,加了一层数据加密的措施,保护数据。
请求流程:用户浏览器发送请求---> 网关(层层网关)--->--->互联网--->Nginx服务器--->解析请求--->找到资源--->返回给用户
虚拟主机原理
如果有这样一个场景,假如一台主机只挂载了一个站点,当这个站点并没有太多的访问量时,就会造成资源过剩(有剩余资源),这时我们可以开启虚拟主机,挂载多个站点,合理的利用主机的资源。
一个IP地址可以对应多个域名,根据域名的不同,我们去寻找这些域名对应的资源目录,找到这些资源之后,返回给用户。
当然,我们需要在请求报文中加上这个域名,不然服务器不知道我们需要哪个域名的资源
域名解析与泛域名解析实战
老师推荐 everything软件 可以直接查
找到本机的hosts文件
怎么改
一种是复制到别的地方 改完后再粘回来
一种是直接修改权限去改文件
阿里云操作
阿里云买域名
登录-控制台-域名-买了后 点解析-添加记录
记录类型 A(最常用,指向ipv4) cname ns mx
主机记录配前缀 eg www *(通配符,泛解析)
解析线路 网页有解释
记录值 ip地址(A) 或者域名(CNAME)
TTL 多久失效 失效后会重新提交记录值
·域名解析相关企业项目实战技术架构
多用户二级域名
短网址
httpdns
·Nginx中的虚拟主机配置
虚拟主机
原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务
servername匹配规则
我们需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。
完整匹配
我们可以在同一servername中匹配多个域名
server_name vod.mmban.com www1.mmban.com;
通配符匹配
server_name *.mmban.com
通配符结束匹配
server_name vod.*;
正则匹配
server_name ~^[0-9]+\.mmban\.com$;
总结下
很烦 本来能多看会 但是实际上没有跟着视频来 用的docker容器出现不少问题,例如追加挂载,到现在也没弄好 又重新创建了一个 忙了俩小时 还是有问题,这也算学习了 哎