第八天..

练习

保证文件名唯一

给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹:在第 i 分钟,新建名为 names[i] 的文件夹。

由于两个文件 不能 共享相同的文件名,因此如果新建文件夹使用的文件名已经被占用,系统会以 (k) 的形式为新文件夹的文件名添加后缀,其中 k 是能保证文件名唯一的 最小正整数 。

返回长度为 n 的字符串数组,其中 ans[i] 是创建第 i 个文件夹时系统分配给该文件夹的实际名称。

 

示例 1:

输入:names = ["pes","fifa","gta","pes(2019)"]
输出:["pes","fifa","gta","pes(2019)"]
解释:文件系统将会这样创建文件名:
"pes" --> 之前未分配,仍为 "pes"
"fifa" --> 之前未分配,仍为 "fifa"
"gta" --> 之前未分配,仍为 "gta"
"pes(2019)" --> 之前未分配,仍为 "pes(2019)"
示例 2:

输入:names = ["gta","gta(1)","gta","avalon"]
输出:["gta","gta(1)","gta(2)","avalon"]
解释:文件系统将会这样创建文件名:
"gta" --> 之前未分配,仍为 "gta"
"gta(1)" --> 之前未分配,仍为 "gta(1)"
"gta" --> 文件名被占用,系统为该名称添加后缀 (k),由于 "gta(1)" 也被占用,所以 k = 2 。实际创建的文件名为 "gta(2)" 。
"avalon" --> 之前未分配,仍为 "avalon"
示例 3:

输入:names = ["onepiece","onepiece(1)","onepiece(2)","onepiece(3)","onepiece"]
输出:["onepiece","onepiece(1)","onepiece(2)","onepiece(3)","onepiece(4)"]
解释:当创建最后一个文件夹时,最小的正有效 k 为 4 ,文件名变为 "onepiece(4)"。
示例 4:

输入:names = ["wano","wano","wano","wano"]
输出:["wano","wano(1)","wano(2)","wano(3)"]
解释:每次创建文件夹 "wano" 时,只需增加后缀中 k 的值即可。
示例 5:

输入:names = ["kaido","kaido(1)","kaido","kaido(1)"]
输出:["kaido","kaido(1)","kaido(2)","kaido(1)(1)"]
解释:注意,如果含后缀文件名被占用,那么系统也会按规则在名称后添加新的后缀 (k) 。
 

提示:

1 <= names.length <= 5 * 10^4
1 <= names[i].length <= 20
names[i] 由小写英文字母、数字和/或圆括号组成。

代码

class Solution {
    public String[] getFolderNames(String[] names){
        Map<String, Integer> map = new HashMap<>();//哈希表
        for (int i =0; i< names.length; i++) {
            if(map.containsKey(names[i])){//比哈希值 如果有 就继续 没有就跳出
                int k=map.get(names[i]);//一开始都是1
                //当map里面存在一个例如 so(1)时 判断map存在so(1) k++
                while (map.containsKey((names[i])+"("+k+")")){
                    k++;
                }
                map.put(names[i],k);//接着放入so(2)
                names[i] = names[i]+"("+k+")";
            }
            map.put(names[i],1);//每个放入的字符串从1开始
        }
        return names;
    }
}

我的第一眼想的是暴力枚举

先比值 从后倒着来 然后出现相同的记录一次 最后再赋值

然后我就这么写了 写了一半突然想看看别人的

发现还有个hash值这个东西

tmd 学了,雀氏学了,但是用的时候总是记不起来

有了hash值就更好解决了

  1. 比哈希值,没有就直接存入

  1. 有相同哈希值,记录k值有多少

  1. 判断 是否存在name相同的名字的 有就k+1

  1. 接着放入map里面

  1. ps:11 12行代码顺序不同 执行的时间也不同

八股

并行和并发有什么区别?

并行是同一时间多件事情同时发生 也就是说 在不同实体上的多个事件同时发生

并发是同一时间多件事情间隔发生 在同一实体上的多个事件间隔发生

并发可以让处理器充分发挥性能

线程和进程的区别

一个程序有多个进程 一个进程可以有多个线程 线程是cpu调度和分派的基本单位

进程有自己的内存单元 多个线程共享内存资源 而线程是进程的一个实体,同一个进程

的多个线程可以并发执行

守护线程是什么

服务线程,就是服务其他的线程

创建线程有哪几种方式?

继承thread类线程 runnable接口创建线程 通过callable和future创建线程

常用的是前两类

都是通过run方法开启线程对象,不过一个是继承,一个是实现接口

都要用start方法启动线程

nignx第一天

怎么docker安装的

我是看这位大神的

http://t.csdn.cn/KIGy2

附上代码

找nginx
docker search nginx
拉取最新的
docker pull nginx
查看
docker images
跑容器 -d后台允许 --name 自定义名字 -p 映射主机端口:容器内部端口 nginx 你下载的版本 默认最新
docker run -d --name mynginx -p 3344:80 nginx

修改配置环境
方法1
进容器操作
docker exec -it mynginx /bin/bash
进入到nginx容器内部后,我们可以cd /etc/nginx,可以看到相关的nginx配置文件都在/etc/nginx目录下
而nginx容器内的默认首页html文件目录为/usr/share/nginx/html
日志文件位于/var/log/nginx
执行exit命令我们可以从容器内部退出。

方法2
将nginx容器内部配置文件挂载到主机
详细看大神
https://blog.csdn.net/weixin_46244732/article/details/114315708?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-114315708-blog-123507820.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=3
或者
https://blog.csdn.net/BThinker/article/details/123507820

PS
为啥说喜欢用容器
docker run -d --name nginx01 -p 3344:80 nginx
docker run -d --name nginx02 -p 3355:80 nginx
两行代码 拉了两个nginx了 
学习阶段又不是工作阶段 当然是越简单越好
反正到工作了还是得一个一个对着电脑配置环境
真当自己学了就会了
反正我不会 另外附上访问地址
  linux虚拟机地址:3344 
eg:http://192.168.179.130:3344/

方法2快速链接http://t.csdn.cn/EgICE // http://t.csdn.cn/oBHWN

中间出现ipv4转发问题

是看这位大神的

https://www.cnblogs.com/wts19xx/p/17077033.html

使用nignx

例如进入容器后
nignx -s stop 快速停止 
.........quit 优雅关闭
.........reload 重新加载配置

其他命令

关于防火墙
关闭防火墙
systemctl stop firewalld.service
禁止防火墙开机启动
systemctl disable firewalld.service
放行端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
重启防火墙
firewall-cmd --reload
安装成系统服务
创建服务脚本(自动开启)
vi /usr/lib/systemd/system/nginx.service
服务脚本内容
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重新加载系统服务
systemctl daemon-reload
启动服务
systemctl start nginx.service
开机启动
systemctl enable nginx.service

硅谷老师有个自启动服务脚本 可能docker以后会用到,记录一下

https://www.cnblogs.com/erlou96/p/16878426.html

今天偷懒了,才第八天 惭愧,也不立flag

明天继续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值