第十天..

练习

经营摩天轮的最大利润

你正在经营一座摩天轮,该摩天轮共有 4 个座舱 ,每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱,但每次轮转都需要支付一定的运行成本 runningCost 。摩天轮每次轮转都恰好转动 1 / 4 周。

给你一个长度为 n 的数组 customers , customers[i] 是在第 i 次轮转(下标从 0 开始)之前到达的新游客的数量。这也意味着你必须在新游客到来前轮转 i 次。每位游客在登上离地面最近的座舱前都会支付登舱成本 boardingCost ,一旦该座舱再次抵达地面,他们就会离开座舱结束游玩。

你可以随时停下摩天轮,即便是 在服务所有游客之前 。如果你决定停止运营摩天轮,为了保证所有游客安全着陆,将免费进行所有后续轮转 。注意,如果有超过 4 位游客在等摩天轮,那么只有 4 位游客可以登上摩天轮,其余的需要等待 下一次轮转 。

返回最大化利润所需执行的 最小轮转次数 。 如果不存在利润为正的方案,则返回 -1 。

 

示例 1:



输入:customers = [8,3], boardingCost = 5, runningCost = 6
输出:3
解释:座舱上标注的数字是该座舱的当前游客数。
1. 8 位游客抵达,4 位登舱,4 位等待下一舱,摩天轮轮转。当前利润为 4 * $5 - 1 * $6 = $14 。
2. 3 位游客抵达,4 位在等待的游客登舱,其他 3 位等待,摩天轮轮转。当前利润为 8 * $5 - 2 * $6 = $28 。
3. 最后 3 位游客登舱,摩天轮轮转。当前利润为 11 * $5 - 3 * $6 = $37 。
轮转 3 次得到最大利润,最大利润为 $37 。
示例 2:

输入:customers = [10,9,6], boardingCost = 6, runningCost = 4
输出:7
解释:
1. 10 位游客抵达,4 位登舱,6 位等待下一舱,摩天轮轮转。当前利润为 4 * $6 - 1 * $4 = $20 。
2. 9 位游客抵达,4 位登舱,11 位等待(2 位是先前就在等待的,9 位新加入等待的),摩天轮轮转。当前利润为 8 * $6 - 2 * $4 = $40 。
3. 最后 6 位游客抵达,4 位登舱,13 位等待,摩天轮轮转。当前利润为 12 * $6 - 3 * $4 = $60 。
4. 4 位登舱,9 位等待,摩天轮轮转。当前利润为 * $6 - 4 * $4 = $80 。
5. 4 位登舱,5 位等待,摩天轮轮转。当前利润为 20 * $6 - 5 * $4 = $100 。
6. 4 位登舱,1 位等待,摩天轮轮转。当前利润为 24 * $6 - 6 * $4 = $120 。
7. 1 位登舱,摩天轮轮转。当前利润为 25 * $6 - 7 * $4 = $122 。
轮转 7 次得到最大利润,最大利润为$122 。
示例 3:

输入:customers = [3,4,0,5,1], boardingCost = 1, runningCost = 92
输出:-1
解释:
1. 3 位游客抵达,3 位登舱,0 位等待,摩天轮轮转。当前利润为 3 * $1 - 1 * $92 = -$89 。
2. 4 位游客抵达,4 位登舱,0 位等待,摩天轮轮转。当前利润为 is 7 * $1 - 2 * $92 = -$177 。
3. 0 位游客抵达,0 位登舱,0 位等待,摩天轮轮转。当前利润为 7 * $1 - 3 * $92 = -$269 。
4. 5 位游客抵达,4 位登舱,1 位等待,摩天轮轮转。当前利润为 12 * $1 - 4 * $92 = -$356 。
5. 1 位游客抵达,2 位登舱,0 位等待,摩天轮轮转。当前利润为 13 * $1 - 5 * $92 = -$447 。
利润永不为正,所以返回 -1 。
 

提示:

n == customers.length
1 <= n <= 105
0 <= customers[i] <= 50
1 <= boardingCost, runningCost <= 100
class Solution {
    public int minOperationsMaxProfit(int[] customers, int boardingCost, int runningCost) {
 
        int wait=0;//等待人数
        int profit=0;//利润
        int maxprofit=0;//记录最大的利润
        int time=-1;//记录几次 有概率利润正好为0 返回-1
        for (int i = 0; i < customers.length||wait>0; i++) {
               if(i<customers.length){
                   wait = wait+customers[i];
               }
               int num= Math.min(wait, 4);//wait>4取4 小于4取wait
            profit = profit+num*boardingCost-runningCost;//利润
            wait = wait-num;//等待数-num
            if(maxprofit<profit) {
                maxprofit=profit;
                time = i+1;
            }
        }
        return time;
    }
}

思路

  1. 首先需要获得每次上摩天轮后剩余的人 也就是等待人数wait

  1. 其次需要计算每一轮的利润 profit

  1. 如果利润不是正的 那继续循环就没有意义了 所以需要maxprofit>profit时 循环继续

  1. 最后返回最小次数 所以需要计数器 time

  1. 每次都会上去一些人 所以在wait大于4时获取4个人(摩天轮最大人数),wait小于4时获取wait

  1. 每次计算利润后都要将wait减去上去的人数 直到wait=0 结束循环

说是中等题,感觉跟简单题一样 算是我为数不多敢直接吐槽简单的题了

一开始写出来的时间超时了 用了一个for一个while

后来看了别人的代码发现 不需要费心费力的去算出每个num能上去几个 不满4人的填到下一个num直到等于0 写个等待人数就行 反正都是做出来了 又学到了一些知识

八股

线程的 run()和 start()有什么区别?

run方法是单个线程的线程体 是用来完成线程的方法

start方法是可以开启多个线程,是用来启动多线程运行的

而run方法会运行结束 start方法则会把线程从就绪状态开启到运行状态

创建线程池有哪几种方式?

①. newFixedThreadPool(int nThreads)

创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程规模将不再变化,当线程发生未预期的错误而结束时,线程池会补充一个新的线程。

②. newCachedThreadPool()

创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制。

③. newSingleThreadExecutor()

这是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行。

④. newScheduledThreadPool(int corePoolSize)

创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。

线程池都有哪些状态?

运行running 关闭shutdong 停止stop 整理tidying 终止Terminated

线程池中 submit()和 execute()方法有什么区别?

两者参数不同 前者可以定义返回值 后者结合catch try会抛出异常

所以submit方便异常处理

nginx第三天

nginx虚拟主机域名配置

例如自建了www和vod文件夹 各自放入index.html文件

可以去conf去改server虚拟主机的host

出现了一个问题

忙了将近4个小时

给我干恶心了

我看老师直接改conf里面的server

我就跟着改了 因为我是docker 所以出现一个问题

我里面改了,外面不映射

于是我去搜如何映射出docker

DOCKER 给运行中的容器添加映射端口

方法1

1、获得容器IP

将container_name 换成实际环境中的容器名

docker inspect `container_name` | grep IPAddress

2、 iptable转发端口

将容器的8000端口映射到docker主机的8001端口

iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000
[root@lixl appinstall]# iptables -t nat -A  DOCKER -p tcp --dport 18001 -j DNAT --to-destination 172.17.0.1:2181
[root@lixl appinstall]# iptables -t nat -A  DOCKER -p tcp --dport 18003 -j DNAT --to-destination 172.17.0.3:2181
[root@lixl appinstall]# iptables -t nat -A  DOCKER -p tcp --dport 18006 -j DNAT --to-destination 172.17.0.6:2181
方法2

1.提交一个运行中的容器为镜像

docker commit containerid foo/live
1
2.运行镜像并添加端口

docker run -d -p 8000:80  foo/live /bin/bash

我发现,只有我的80端口可以映射出去,因为我本来就设置了一个80端口

真是服了 我要新建立一个端口 再映射

一开始我不信邪 于是我忙了一小时才发现,这是无用功

之后我又搜

Docker给nginx添加端口映射

1、查看容器ID
执行命令

docker inspect nginx # 容器名
输出

[
    {
        "Id": "135254e3429d1e75aa68569137c753b789416256f2ced52b4c5a85ec3849db87", # hash_of_the_container
        "Created": "2020-08-21T09:41:36.597993005Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
...
2、修改之前一定要先停掉容器,否则自动还原
docker stop nginx
3、修改配置文件
修改hostconfig.json
cd /var/lib/docker/containers/135254e3429d1e75aa68569137c753b789416256f2ced52b4c5a85ec3849db87 # container id
vim hostconfig.json
找到端口绑定,原本内容:

[图片上传失败...(image-3497c8-1659341282102)]

照猫画虎,添加端口

"PortBindings": {
    "80/tcp": [
        {
            "HostIp": "",
            "HostPort": "80"
        }
    ],
    "8080/tcp": [
        {
            "HostIp": "",
            "HostPort": "8080"
        }
    ],
    "8189/tcp": [
        {
            "HostIp": "",
            "HostPort": "8189"
        }
    ]
},
修改config.v2.json
同路径下打开config.v2.json,修改:ExposedPorts

"ExposedPorts": {
    "80/tcp": {},
    "8080/tcp": {},
    "8189/tcp": {}
},
... # 略
注意
很多文章中提到还要修改Ports,实际上是不需要的,只有在你没有stop容器时,Ports才会有值,如果关闭了容器,就是null。当然如果你修改了也无所谓,因为重启容器后,就会被刷新。

4、保存、退出、重启容器
sudo systemctl restart docker.service # 重启docker服务
docker start nginx # 容器名 # 启动容器

https://www.jianshu.com/p/73a41f884569

中间出现了各种 什么权限问题哪都是小问题

最难受的是 中间改了一次发现容器没了!?

经过排查发现是多了个逗号

这时候又过了一个小时

然后我发现,配好的端口没有网页

一直404

然后

我又去看我的conf 一会把server放到nginx.conf

一会把server放到default.conf

就是不生效

我直接治愈了

躺下思考人生半小时

不甘心重新创容器

又重新开始

再次写入conf 竟然这次可以运行了

真TM离谱

之后再次尝试第一个 就是

iptables -t nat -A DOCKER -p tcp --dport 8004 -j DNAT --to-destination 172.17.0.4:8999

因为第二次我去配置文件设置了新的端口

所以这次我尝试用第一个绑定第二个

才发现这TM只能映射开放的端口

而第二个方法再配置文件写的开放的端口也不知道怎么就能用了

而且我一直不停的重启容器

docker restart 0367988e9445

终于真正完成这个破问题了

从下午2点40到6点15

我特么终于结束了

这个破错误我感觉我不可能再忘了

docker那真的,学的忘着

虽然这个错误可能在别人眼里几分钟的事情,甚至是常识

但是我解决的一瞬间,我感觉灵魂升华了,淦

又没听课

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值