stacks and queues--codility
lesson 7: stacks and queues
1. Nesting
Determine whether given string of parentheses is properly nested.
A string S consisting of N characters is called properly nested if:
- S is empty;
- S has the form "(U)" where U is a properly nested string;
- S has the form "VW" where V and W are properly nested strings.
For example, string "(()(())())" is properly nested but string "())" isn't.
Assume that:
- N is an integer within the range [0..1,000,000];
- string S consists only of the characters "(" and/or ")".
Complexity:
- expected worst-case time complexity is O(N);
- expected worst-case space complexity is O(1) (not counting the storage required for input arguments).
solution:
- Test score 100%
- used stack
- must have "(" before ")"
def solution(S):
# write your code in Python 2.7
tmp = 0
for elem in S:
if elem == "(":
tmp += 1
elif elem == ")":
tmp -= 1
if tmp < 0:
return 0
if tmp == 0:
return 1
else:
return 0
2. StoneWall
You are going to build a stone wall. The wall should be straight and N meters long, and its thickness should be constant; however, it should have different heights in different places. The height of the wall is specified by a zero-indexed array H of N positive integers. H[I] is the height of the wall from I to I+1 meters to the right of its left end. In particular, H[0] is the height of the wall's left end and H[N−1] is the height of the wall's right end.
The wall should be built of cuboid stone blocks (that is, all sides of such blocks are rectangular). Your task is to compute the minimum number of blocks needed to build the wall.
For example, given array H containing N = 9 integers:
H[0] = 8 H[1] = 8 H[2] = 5
H[3] = 7 H[4] = 9 H[5] = 8
H[6] = 7 H[7] = 4 H[8] = 8
the function should return 7. The figure shows one possible arrangement of seven blocks.

Assume that:
- N is an integer within the range [1..100,000];
- each element of array H is an integer within the range [1..1,000,000,000].
Cover "Manhattan skyline" using the minimum number of rectangles.
- Test score 100%
def solution(H):
# write your code in Python 2.7
cnt = 0
stack = []
for elem in H:
while len(stack)!= 0 and stack[-1] > elem:
stack.pop()
if len(stack) != 0 and stack[-1] == elem:
pass
else:
stack.append(elem)
cnt += 1
return cnt
3. Brackets
Determine whether a given string of parentheses is properly nested.
Task description
A string S consisting of N characters is considered to be properly nested if any of the following conditions is true:
- S is empty;
- S has the form "(U)" or "[U]" or "{U}" where U is a properly nested string;
- S has the form "VW" where V and W are properly nested strings.
For example, the string "{[()()]}" is properly nested but "([)()]" is not.
For example, given S = "{[()()]}", the function should return 1 and given S = "([)()]", the function should return 0, as explained above.
Assume that:
- N is an integer within the range [0..200,000];
- string S consists only of the following characters: "(", "{", "[", "]", "}" and/or ")".
Complexity:
- expected worst-case time complexity is O(N);
- expected worst-case space complexity is O(N) (not counting the storage required for input arguments).
用一个stack,当栈头和新来的元素配对,即弹出,否则压栈。
注意:list为空的时候, 还有多个空值的list。
solution:
def check(t,s):
if len(t) < 1:
return 0
if s == ')' and t[-1] == '(':
return 1
elif s == ']' and t[-1] == '[':
return 1
elif s == '}' and t[-1] == '{':
return 1
else:
return 0
def solution(S):
tmp = []
for elem in S:
if elem == ' ':
continue
if check(tmp, elem):
tmp.pop()
else:
tmp.append(elem)
#print "append: %s, len: %s" %(elem,len(tmp))
if len(tmp) < 1:
return 1
else:
return 0
- Fish
Given two non-empty zero-indexed arrays A and B consisting of N integers. Arrays A and B represent N voracious fish in a river, ordered downstream along the flow of the river.
The fish are numbered from 0 to N ? 1. If P and Q are two fish and P < Q, then fish P is initially upstream of fish Q. Initially, each fish has a unique position.
Fish number P is represented by A[P] and B[P]. Array A contains the sizes of the fish. All its elements are unique. Array B contains the directions of the fish. It contains only 0s and/or 1s, where:
- 0 represents a fish flowing upstream,
- 1 represents a fish flowing downstream.
If two fish move in opposite directions and there are no other (living) fish between them, they will eventually meet each other. Then only one fish can stay alive ? the larger fish eats the smaller one. More precisely, we say that two fish P and Q meet each other when P < Q, B[P] = 1 and B[Q] = 0, and there are no living fish between them. After they meet:
- If A[P] > A[Q] then P eats Q, and P will still be flowing downstream,
- If A[Q] > A[P] then Q eats P, and Q will still be flowing upstream.
We assume that all the fish are flowing at the same speed. That is, fish moving in the same direction never meet. The goal is to calculate the number of fish that will stay alive.
For example, consider arrays A and B such that:
A[0] = 4 B[0] = 0
A[1] = 3 B[1] = 1
A[2] = 2 B[2] = 0
A[3] = 1 B[3] = 0
A[4] = 5 B[4] = 0
Initially all the fish are alive and all except fish number 1 are moving upstream. Fish number 1 meets fish number 2 and eats it, then it meets fish number 3 and eats it too. Finally, it meets fish number 4 and is eaten by it. The remaining two fish, number 0 and 4, never meet and therefore stay alive.
For example, given the arrays shown above, the function should return 2, as explained above.
Assume that:
- N is an integer within the range [1..100,000];
- each element of array A is an integer within the range [0..1,000,000,000];
- each element of array B is an integer that can have one of the following values: 0, 1;
- the elements of A are all distinct.
Complexity:
- expected worst-case time complexity is O(N);
- expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).
考虑到所有鱼的速度一致,那么从上游开始check,
前面的鱼如果是往上游走的话,即永远不会被吃或者吃其他鱼,
def solution(A, B):
# write your code in Python 2.7
# record the num of fish with downstream
lastFishDir = 0
stackTmp = []
# check fish from upstream
for fish, curDir in zip(A,B):
if lastFishDir < 1:
stackTmp.append(fish)
#lastFishDir += curDir
else:
if curDir == 0:
while lastFishDir > 0 and fish > stackTmp[-1]:
stackTmp.pop()
lastFishDir -= 1
if len(stackTmp) > 0 and fish < stackTmp[-1]:
continue
stackTmp.append(fish)
else:
stackTmp.append(fish)
lastFishDir += curDir
return len(stackTmp)
思考方式很重要:
由于,上游的鱼如果是往上游走的话,即永远不会被吃或者吃其他鱼,
如果把这样的鱼也放在stack里面,每次fight之后,不太好处理,
故我们可以把一定可以存活的鱼直接计数, 将需要fight的鱼放在stack里面
- [100%]
def solution(A, B):
lastFishDir = 0 # record the num of fish with downstream
stackDown = []
aliveCnt = 0
# check fish from upstream
for fish, curDir in zip(A,B):
if curDir == 1:
# only the downstream fish need fight,
stackDown.append(fish)
else:
while lastFishDir > 0 :
if fish > stackDown[-1]:
stackDown.pop()
lastFishDir -= 1
else:
break
else:
aliveCnt += 1
lastFishDir += curDir
return len(stackDown)+aliveCnt
该博主分析的很详细,https://codesays.com/2014/solution-to-fish-by-codility/
def solution(A, B):
alive_count = 0 # The number of fish that will stay alive
downstream = [] # To record the fishs flowing downstream
downstream_count = 0 # To record the number of elements in downstream
for index in xrange(len(A)):
# Compute for each fish
if B[index] == 1:
# This fish is flowing downstream. It would
# NEVER meet the previous fishs. But possibly
# it has to fight with the downstream fishs.
downstream.append(A[index])
downstream_count += 1
else:
# This fish is flowing upstream. It would either
# eat ALL the previous downstream-flow fishs,
# and stay alive.
# OR
# be eaten by ONE of the previous downstream-
# flow fishs, which is bigger, and died.
while downstream_count != 0:
# It has to fight with each previous living
# fish, with nearest first.
if downstream[-1] < A[index]:
# Win and to continue the next fight
downstream_count -= 1
downstream.pop()
else:
# Lose and die
break
else:
# This upstream-flow fish eat all the previous
# downstream-flow fishs. Win and stay alive.
alive_count += 1
# Currently, all the downstream-flow fishs in stack
# downstream will not meet with any fish. They will
# stay alive.
alive_count += len(downstream)
return alive_count
stacks and queues--codility的更多相关文章
- Cracking the Coding Interview(Stacks and Queues)
Cracking the Coding Interview(Stacks and Queues) 1.Describe how you could use a single array to impl ...
- 612.1.003 ALGS4 | Stacks and Queues
Algorithm | Coursera - by Robert Sedgewick Type the code one by one! 不要拜读--只写最有感触的!而不是仅仅做一个笔记摘录员,那样毫 ...
- Stacks And Queues
栈和队列 大型填坑现场,第一部分的还没写,以上. 栈和队列是很基础的数据结构,前者后进先出,后者先进先出,如下图: 下面开始将客户端和具体实现分开,这样有两个好处:一是客户端不知道实现的细节,但同时也 ...
- CCI_chapter 3 Stacks and Queues
3.1Describe how you could use a single array to implement three stacks for stack 1, we will use [0, ...
- uva 120 stacks of flapjacks ——yhx
Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data ...
- UVa120 - Stacks of Flapjacks
Time limit: 3.000 seconds限时:3.000秒 Background背景 Stacks and Queues are often considered the bread and ...
- Uva 120 - Stacks of Flapjacks(构造法)
UVA - 120 Stacks of Flapjacks Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld &a ...
- Stacks of Flapjacks(栈)
Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data ...
- Stacks of Flapjacks
Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data s ...
随机推荐
- 项目中使用protobuf
在互种系统中数据通信或数据交换可以使用protobuf,他比json.xml的数据量要小一些. 另外因为消息要单独写一个.proto文件,来生成各平台的代码,所以对跨平台通信来说也比较友好. 一.使用 ...
- Linux 笔记 #01# 搭建 Python 环境 & vim 代码高亮
日常收集 vim editor: How do I enable and disable vim syntax highlighting? 搭建 Python 环境 vim editor: How d ...
- SQL优化之limit 1
在某些情况下,如果明知道查询结果只有一个,SQL语句中使用LIMIT 1会提高查询效率. 例如下面的用户表(主键id,邮箱,密码): create table t_user( id int prim ...
- HDU 3820 Golden Eggs
http://acm.hdu.edu.cn/showproblem.php?pid=3820 题意:n*m的格子,每个格子放金蛋或银蛋,每个格子的金蛋和银蛋都有一个对应的点权,如果有两个金蛋相连,则需 ...
- Linux的硬链接和软链接
1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link), 也就是软链接.默认情况下,ln命令产生硬链接. [硬连接]硬连 ...
- IIS 7.5 配置 php 5.4.22 链接 sql 2008(用PDO链接数据库)
最近在接触PHP这块,关于在wndows系统下的php配置,虽然网上已经很多文章,但有时候有些配置找起也麻烦,所以分享给大家. 一.php 5.4.22 下载地址 http://windows.php ...
- Bert学习资料
首先是Bert的论文和 attention is all you need的论文 然后是:将nlp预训练 迁移学习的发展从word2vec 到elmo bert https://mp.weixin.q ...
- python实现本地批量ping多个IP
本文主要利用python的相关模块进行批量ping ,测试IP连通性. 下面看具体代码(python3): #!/usr/bin/env python#-*-coding:utf-8-*- impor ...
- [转载]Java抽象类和接口的学习
http://android.blog.51cto.com/268543/385282/ 抽象类 abstract class 包含抽象方法的类,叫抽象类.而抽象的概念就是抽象出共同属性:成员 ...
- 快速切题 sgu135. Drawing Lines
135. Drawing Lines time limit per test: 0.25 sec. memory limit per test: 4096 KB Little Johnny likes ...