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 ...
随机推荐
- 简单了解下CGI、FastCGI和php-fpm的概念和区别和运行原理
什么是CGI? CGI(Common Gateway Interface),公共网关接口,它是Web服务器与外部应用程序(CGI程序)之间传递信息的接口标准.通过CGI接口,Web服务器就能够获取客户 ...
- FMC简介
FMC简介 FMC ( FPGA Mezzanine Card ) 简而言之,是具有特定功能的子卡模块. Developed by a consortium of companies ranging ...
- Linux的硬链接和软链接
1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link), 也就是软链接.默认情况下,ln命令产生硬链接. [硬连接]硬连 ...
- HTML 入门1
HTML 入门1 一,什么是HTML 超文本标记语言 二,如何写一个HTML文件? 1 通过sublime的文件->新建->保存 "文件名.html"格式 2,在 ...
- python 获取5天前的日期
from datetime import date, timedelta dt = date.today() - timedelta() print('Current Date :',date.tod ...
- python 返回列表中的偶数
def is_even_num(l): enum = [] for n in l: == : enum.append(n) return enum print(is_even_num([, , , , ...
- Android Studio 中实现高德定位并获取相应信息
Android开发项目时常常会遇到定位这个功能,所以写了这篇博客,今天主要讲的高德地图的定位并获取相应信息. 首先导入高德的jar包 选中jar包右键点击 Add As Library, 在buil ...
- dva subscription的使用方法
import { routerRedux } from 'dva/router' export default { namespace: 'notice', state: { notices:[], ...
- 过滤器系列(一)—— Bloom filter
因为要做过滤器相关内容,最近读了一些过滤器方面的文章,准备从中提取主要思想写几篇博客. 作为这系列的第一篇文章,首先得讲一下过滤器是干什么用的.从历史发展来看,过滤器最早出现是作为散列表的替代品,那么 ...
- 字典序全排列(java实现)
import java.util.Arrays; /** *字典序全排列 *字符串的全排列 *比如单词"too" 它的全排列是"oot","oto&q ...