题目链接:leetcode
思路:
链表
1 | """ |
题目链接:leetcode
思路:
链表
1 | """ |
题目链接:leetcode
思路:
链表
1 | # Definition for singly-linked list. |
题目链接:leetcode
思路:
用递归做会超时,发现可以分解为更小的问题,用动态规划
1 | class Solution(object): |
题目链接:leetcode
思路:
遍历原链表,生成新链表
1 | # Definition for singly-linked list with a random pointer. |
题目链接:leetcode
思路:
使用xor异或的性质可以常数空间复杂度解决问题。
1 | class Solution(object): |
题目链接:leetcode
思路:
贪婪
1 | class Solution(object): |
一个更清晰的solution:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21class Solution(object):
def canCompleteCircuit(self, gas, cost):
"""
:type gas: List[int]
:type cost: List[int]
:rtype: int
"""
start, cur_sum, total_sum = 0, 0, 0
for i in range(len(gas)):
diff = gas[i]-cost[i]
cur_sum += diff
total_sum += diff
if cur_sum < 0:
start = i+1
cur_sum = 0
if total_sum >= 0:
return start
return -1
题目链接:leetcode
思路:
bfs
1 | from collections import deque |
题目链接:leetcode
思路:
回溯
class Solution:
def partition(self, s):
"""
:type s: str
:rtype: List[List[str]]
"""
self.s =s
def dfs(s,res,tmp):
if not s:
res.append(tmp[:])
return
for i in range(1,len(s)+1):
stmp = s[:i]
if stmp == stmp[::-1]:
#这行代码等价于
#tmp.append(stmp)
#dfs(s[i:],res,tmp)
#tmp.pop()
dfs(s[i:],res,tmp+[stmp])
res=[]
dfs(self.s,res,[])
return res
1 手动制作1
2
3
4
5
6
7
8
9docker run -itd XXX
docker attach xxx
ctrl +p +q 不关闭容器 从新定位到本地目录
docker cp /Users/xx a5:/usr/xx
docker commit a5 java
把镜像导出为压缩文件
docker save -o service.tar a5
ocker load -i service.tar
docker tag fd12 java:zhuanli
2 Dockerfile1
2
3FROM java
MAINTAINER zhuanli
COPY xx /usr/xx
运行1
docker build -t java:zhuanli .
3 docker-compose.yml1
2
3
4
5
6
7
8version: "3"
services:
sharelist:
image: java
volumes:
- /home/zhuanli/java:/app/cache
ports:
- "33001:33001"
原始信息:http://valgrind.org/docs/manual/mc-manual.html#mc-manual.machine
基本原理:
memcheck实现了一个仿真的CPU,被监控的程序被这个仿真CPU解释执行,从而有机会在所有的内存读写指令发生的时候,检测地址的合法性和读操作的合法性。
一,如何知道那些地址是合法的(内存已分配)?
维护一张合法地址表(Valid-address (A) bits),当前所有可以合法读写(已分配)的地址在其中有对应的表项。该表通过以下措施维护
全局数据(data, bss section)--在程序启动的时候标记为合法地址
局部变量--监控sp(stack pointer)的变化,动态维护
动态分配的内存--截获 分配/释放 内存的调用 :malloc, calloc, realloc, valloc, memalign, free, new, new[], delete and delete[]
系统调用--截获mmap映射的地址
其他--可以显示知会memcheck某地字段是合法的
二,如何知道某内存是否已经被赋值?
维护一张合法值表(Valid-value (V) bits),指示对应的bit是否已经被赋值。因为虚拟CPU可以捕获所有对内存的写指令,所以这张表很容易维护。
局限:
-memcheck无法检测global和stack上的内存溢出,因为溢出的地方也在Valid-address (A) bits中。这是由memcheck 的工作原理决定的。
-慢,20到30倍,被虚拟CPU解释一遍,当然慢
-内存占用高,因为要维护两张表格,而这两张表的维度正比于程序的内存