无重复字符的最长子串
AWSOME DAY Online
Algorithm
题目:无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
题解1
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
int ans = 0;
for(int i=0;i<n;i++)
for(int j=i+1;j<=n;j++)
if(allUnique(s,i,j)) ans = Math.max(ans,j-i);
return ans;
}
public boolean allUnique(String s, int start, int end) {
Set<Character> set = new HashSet<>();
for (int i = start; i<end;i++) {
Character ch = s.charAt(i);
if (set.contains(ch)) return false;
set.add(ch);
}
return true;
}
}
- 时间复杂度:O(n^3)
- 空间复杂度:O(min(n, m))
题解2
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:return 0
left = 0
lookup = set()
n = len(s)
max_len = 0
cur_len = 0
for i in range(n):
cur_len += 1
while s[i] in lookup:
lookup.remove(s[left])
left += 1
cur_len -= 1
if cur_len > max_len:max_len = cur_len
lookup.add(s[i])
return max_len
思路:
这道题主要用到思路是:滑动窗口
什么是滑动窗口?
其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!
如何移动?
我们只要把队列的左边的元素移出就行了,直到满足题目要求!
一直维持这样的队列,找出队列出现最长的长度时候,求出解!
时间复杂度:O(n)O(n)
Review
- AWS 是一个免费的会议,有 AWS 高级讲师在线授课,同时也有如有疑问,有专门的技术人员实时在线解答
- AWSOME DAY Online 适用与IT管理,程序员,架构师,商务,等等
- 注册成功后,如有会议,会有 AWS 工作人员电话通知,并且会有邮箱通知
- 会议时间一般安排在周末下午,会有5个左右的模块,总时间5个小时左右
- 每个会议模块后都有试题,答对后会有 AWS 的证书
- 活动很精彩,墙裂推荐 。。。
Tip
Share
Volumes作用
Docker Compose Volumes
volumes的作用有点类似于VMware里面的共享目录,用于将物理主机里的目录映射到docker虚拟机里。
通常用法
version: '2'
networks:
thinking:
services:
test_1.thinking.com:
image: ubuntu
ports:
- "3333:3333"
container_name: test_1.thinking.com
command: /bin/bash
volumes:
- $PWD/:/test_pwd
tty: true
networks:
- thinking
test_2.thinking.com:
image: ubuntu
ports:
- "4444:4444"
container_name: test_2.thinking.com
command: /bin/bash
tty: true
networks:
- thinking
其中
volumes:
- $PWD/:/test_pwd
表示将物理机的当前目录映射到docker虚拟机/test_pwd里面。
执行
$ docker-compose -f test_voloumes.yaml up -d
Creating network "desktop_thinking" with the default driver
Creating test_1.thinking.com ... done
Creating test_2.thinking.com ... done
$ docker exec -it test_1.thinking.com /bin/bash
root@6322d7abd4b6:/# ls
bin dev home lib64 mnt proc run srv test_pwd usr
boot etc lib media opt root sbin sys tmp var
root@6322d7abd4b6:/# ls /test_pwd/
docker-compose-test.yml docker-compose.yml test test_voloumes.yaml
可以看到映射成功了。
特殊用法 在研究fabric项目的时候还发现有另外一种用法
version: '2'
volumes:
test_1.thinking.com:
test_2.thinking.com:
networks:
thinking:
services:
test_1.thinking.com:
image: ubuntu
ports:
- "3333:3333"
container_name: test_1.thinking.com
command: /bin/bash
volumes:
- test_1.thinking.com:/test
- $PWD/:/test_pwd
tty: true
networks:
- thinking
test_2.thinking.com:
image: ubuntu
ports:
- "4444:4444"
container_name: test_2.thinking.com
command: /bin/bash
tty: true
networks:
- thinking
试一下
$ docker-compose -f test_voloumes.yaml up -d
Creating volume "desktop_test_1.thinking.com" with default driver
Creating volume "desktop_test_2.thinking.com" with default driver
Recreating test_1.thinking.com ...
Recreating test_1.thinking.com ... done
$ docker volume ls
DRIVER VOLUME NAME
local desktop_test_1.thinking.com
local desktop_test_2.thinking.com
$ docker volume inspect desktop_test_1.thinking.com
[
{
"CreatedAt": "2018-06-06T02:37:41-07:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/desktop_test_1.thinking.com/_data",
"Name": "desktop_test_1.thinking.com",
"Options": null,
"Scope": "local"
}
]
这看起来意思是volume test_1.thinking.com对应的物理机是/var/lib/docker/volumes/desktop_test_1.thinking.com/_ data,映射到docker虚拟机里面是/test,检验一下
$ docker exec -it test_1.thinking.com /bin/bash
root@104a3ebe6639:/# ls
bin dev home lib64 mnt proc run srv test tmp var
boot etc lib media opt root sbin sys test_pwd usr
root@104a3ebe6639:/# mkdir -p /test/fuck
到物理机里面去看
$ ls /var/lib/docker/volumes/desktop_test_1.thinking.com/_data
ls: cannot access '/var/lib/docker/volumes/desktop_test_1.thinking.com/_data': Permission denied
$ sudo ls /var/lib/docker/volumes/desktop_test_1.thinking.com/_data
fuck
两数相加
Deploying the ELK Stack on Kubernetes with Helm
Algorithm
题目:两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头
题解:
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
re = ListNode(0)
r =re
carry = 0
while(l1 or l2):
x = l1.val if l1 else 0
y = l2.val if l2 else 0
s = carry + x + y
carry = s//10
r.next = ListNode(s%10)
r = r.next
if(l1 !=None):l1 = l1.next
if(l2 !=None):l2 = l2.next
if(carry > 0):
r.next = ListNode(1)
return re.next
- 时间复杂度:O(\max(m, n)),假设 mm 和 nn 分别表示 l1l1 和 l2l2 的长度,上面的算法最多重复 \max(m, n)max(m,n) 次。
- 空间复杂度:O(\max(m, n)), 新列表的长度最多为 \max(m,n) + 1max(m,n)+1。
Review
-
基于kbs集群部署ELK 并通过Helm 管理ELK
- 其中包括整个的安装步骤
Tip
Atom
插件功能丰富,常用markdown 插件作文档编辑,同时配合支持git github markdown预览等插件,特别方便。当然也包括编程插件
Share
两数之和
Amazon Translate
Algorithm
题目:两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
题解
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
#num = len(nums);
for n in range(0,len(nums)):
#print(n,nums[n]);
for m in range(n+1,len(nums)):
#print(n,m,nums[n],nums[m]);
if nums[n]+nums[m] == target:
lis = [];
lis.append(n);
lis.append(m);
return lis;
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
官方题解,请打开连接
Review
Amazon Translate 新增加一些国家语言
- Amazon Translate 新支持两罗马,希腊等国家
- AT 到目前支持32个国家的语言翻译,Google Translate 支持100多个国家
- 文章贴除了 AT API 相当简介
- Amazon Translate实时翻译连接
- 翻译无语言输出,有应用集成提示
- 初步连接,更偏向与B端
- 以下是 Amazon Translate 支持地区
- 亚太区域 (孟买)
- 欧洲 (爱尔兰)
- 亚太区域 (新加坡)
- 亚太区域 (首尔)
- 欧洲 (法兰克福)
- 亚太区域 (东京)
- 美国东部 (弗吉尼亚北部)
- 美国东部 (俄亥俄)
- 加拿大 (中部)
- 美国西部 (俄勒冈)
顺便说下,aws 技术博客,含有真人语言阅读文章,体验不错
Tip
Markdown基本语法
markdown,让我喜欢上记录笔记,向大家推荐
Share
nginx
为什么要分享便连接
- 官网文档都是精华所在,耐着性质看能看懂的
- 在极刻时间淘辉老师的带领下,学习 Nginx核心知识100讲 nginx.org
Alpine简要介绍
Alpine 的意思是“高山的”,比如 Alpine plants高山植物,Alpine skiing高山滑雪、the alpine resort阿尔卑斯山胜地。 Alpine Linux 网站首页注明“Small!Simple!Secure!Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.”概括了以下特点:
1、小巧:基于Musl libc和busybox,和busybox一样小巧,最小的Docker镜像只有5MB;
2、安全:面向安全的轻量发行版;
3、简单:提供APK包管理工具,软件的搜索、安装、删除、升级都非常方便。
4、适合容器使用:由于小巧、功能完备,非常适合作为容器的基础镜像。
notice
- 进入终端使用 /bin/sh (其他使用 /bin/bash )
docker container run -p 82:80 --name myalpine_naginx -itd king101125s/alpine_nginx:v1.0.0 /bin/sh docker container exec -it 28545d300667 /bin/sh
for nginx config
apk add make libc-dev gcc pcre-dev zlib-dev linux-headers libxslt-dev gd-dev geoip-dev perl-dev libedit-dev mercurial alpine-sdk findutils
参考文档
一些小技巧
DOCKER 给运行中的容器添加映射端口
- 方法1 (没成功过)
1、 获得容器IP
将container_name 换成实际环境中的容器名
docker inspect
container_name
| grep IPAddress
2、 iptable转发端口 将容器的80端口映射到docker主机的82端口 iptables -t nat -A DOCKER -p tcp –dport 82 -j DNAT –to-destination 172.17.0.4:80
- 方法2(推荐使用) 1、 提交一个运行中的容器为镜像 docker commit containerid king101125s/alpine_naginx:v1.0.0
2、 运行镜像并添加端口 docker run -p 82:80 -name myalpine_naginx -it king101125s/alpine_naginx:v1.0.0 /bin/sh
docker常用命令
镜像中 安装插件
这个命令会在docker容器中执行”apt-get install -y ping”,也就是安装一个ping命令,运行完之后容器就自动退出了
docker run ddfddf/tutorial apt-get install -y ping
docker commit 0299878039f0 ddfddf/ping #0299878039f0 通过 docker ps -a 查找
复制文件到本地
docker cp [OPTIONS] [CONTAINER_ID]:[SRC_PATH] [DEST_PATH]
docker cp mynginx:/etc/nginx /etc/nginx
复制文件到镜像
docker cp /etc/nginx mynginx:/etc/nginx
从 container 创建 image
- 命令
docker commit [container] [imageName]
- 实例
docker commit nginx king101125s/nginxStudy:v1
push images到hub.docker.com
- 命令
docker push usename/repository:TAG
- 实例
docker push king101125s/nginxStudy:v1
参看容器ip
$ docker inspect container
设置mysql密码 (运行mysql(–name 容器名称 -e MYSQL_ROOT_PASSWORD设置初始密码 -p 3307:3306 端口映射,主机端口3307))
docker run --name mysql8.0.19 -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -d mysql:8.0.19
设置redis(设置密码只需要加上–requirepass,设置redis持久化 –appendonly yes)
docker run -d --name redis_rc-alpine -p 6378:6379 redis:rc-alpine --requirepass "123456"
docker run -d --name redis_rc-alpine_persistence -p 6377:6379 redis:rc-alpine --requirepass "123456" --appendonly yes -v $PWD/data:/data
docker run -d --name redis_rc-alpine_persistence_data -p 6376:6379 redis:rc-alpine --requirepass "123456" --appendonly yes -v $PWD/data:/data
设置rabbitMQ密码
docker run -d --name rabbitmq3.7.7 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin df80af9ca0c9
设置mongo 密码
docker pull mongo:4.4.2-bionic
docker run -d -p 27017:27017 --name mongodb_4.2_bionic -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 bcef5fd2979d
创建&运行ActiveMQ容器
```shell script docker run -d –name activemq_5.15.9_alpine_1 -p 61617:61616 -p 8162:8161 rmohr/activemq:5.15.9-alpine
admin:admin admin 管理员权限
user:user user 用户权限
## 创建&运行zookeeper容器
```shell script
docker run --privileged=true -d --name zookeeper --publish 2181:2181 -d zookeeper:3.5.6
说明: -d 后台运行容器; –name 指定容器名; -p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号); -v 映射目录或文件; –hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名); -e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)
docker machine 使用
Docker Machine 是 Docker 官方编排(Orchestration)项目之一,负责在多种平台上快速安装 Docker 环境。 Docker Machine 项目基于 Go 语言实现,目前在 Github 上进行维护
参考文档
https://yeasy.gitbooks.io/docker_practice/machine/
339 post articles, 43 pages.