第九天..

练习

按位与为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学习的的开始就发现跟课里面的位置不一样

详细看下面的大佬给的地址

http://t.csdn.cn/uk8Ni

通过官网的查看发现,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容器出现不少问题,例如追加挂载,到现在也没弄好 又重新创建了一个 忙了俩小时 还是有问题,这也算学习了 哎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值