来源:LeetCode面试经典 150 题
第二题:移除元素
题目描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
解题思路
这也是个简单题,思路也很简单,循环遍历数组中所有元素,然后将相同的数去掉即可。 一遍过,直接丢代码。
func removeElement(nums []int, val int) int {
length := len(nums)
l :=length
j:=0
for i:=0 ; i<length ; i++{
if nums[i] != val{
nums[j]=nums[i]
j++
}else{
l--
}
}
return l
}
官方解题答案
emmm,好嘛官方第二种双指针优化和我的解题思路一样。没啥好说了,过。 再奖励自己一道题
dockerfile
什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
DockerFile的保留字指令
- FROM:指定基础镜像
- MAINTAINER:镜像维护者姓名及邮箱地址
- RUN:容器构建时需要运行的命令
- EXPOSE:当前容器对外暴露的端口号
- WORKDIR:指定在创建容器后,终端默认登录进来的工作目录
- ENV:用来在构建镜像过程中设置环境变量
- ADD:将宿主机目录下的文件拷贝进镜像,ADD命令会自动处理URL和解压tar压缩包
- COPY:拷贝文件、目录到镜像中。具体是将从构建上下文目录中<src原路径>的文件或目录复制到新一层镜像的<目标路径>位置 ,有两种写法:COPY src dest 或者 COPY ["src", "dest"]
- VOLUME:容器数据卷,用于数据保存和持久化工作
- CMD:指定一个容器启动时要运行的命令
注意DockerFile中可以有多个CMD指令,但只有最后一个在启动时生效,CMD会被 docker run 之后的命令或参数覆盖
CMD指令的格式和RUN相似,也是两种格式:
shell格式:CMD <命令>
exec格式:CMD ["可执行文件", "参数1", "参数2" ...] 参数列表格式:CMD ["参数1", "参数2", ...],在指定了ENTRYPOINT 指令后,用CMD指定具体的参数。
- ENTRYPOINT:指定一个容器启动时要运行的命令,与CMD一样都是在指定容器启动程序及参数(下面通过实例2将他们的区别)。
- ONBUILD:当构建一个被继承的DockerFile时运行命令, 父镜像在被子镜像继承后,父镜像的ONBUILD被触发。
构建镜像
我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
下面是今天的作业,完成一个Dockerfile构建镜像。使用了多段构建技术,将编译镜像和运行镜像分离,达到缩小镜像体积的目的
from golang:1.16-alpine as build
env myname="wangkeyang"
workdir /app
add . ./
run GOOS=linux go build -o hello helloworld.go
from scratch
workdir /
env myname="wangkeyang"
copy --from=build /app/hello .
copy --from=build /app/dockerfile /home/dockerfile
cmd ["./hello"]