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

  1. 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的更多相关文章

  1. 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 ...

  2. 612.1.003 ALGS4 | Stacks and Queues

    Algorithm | Coursera - by Robert Sedgewick Type the code one by one! 不要拜读--只写最有感触的!而不是仅仅做一个笔记摘录员,那样毫 ...

  3. Stacks And Queues

    栈和队列 大型填坑现场,第一部分的还没写,以上. 栈和队列是很基础的数据结构,前者后进先出,后者先进先出,如下图: 下面开始将客户端和具体实现分开,这样有两个好处:一是客户端不知道实现的细节,但同时也 ...

  4. 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, ...

  5. uva 120 stacks of flapjacks ——yhx

     Stacks of Flapjacks  Background Stacks and Queues are often considered the bread and butter of data ...

  6. UVa120 - Stacks of Flapjacks

    Time limit: 3.000 seconds限时:3.000秒 Background背景 Stacks and Queues are often considered the bread and ...

  7. Uva 120 - Stacks of Flapjacks(构造法)

    UVA - 120  Stacks of Flapjacks Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld &a ...

  8. Stacks of Flapjacks(栈)

     Stacks of Flapjacks  Background Stacks and Queues are often considered the bread and butter of data ...

  9. Stacks of Flapjacks

    Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data s ...

随机推荐

  1. P2043 质因子分解(阶乘的质因数分解)

    P2043 质因子分解 对$n!$进行质因数分解的一种高效算法 首先,筛出$<=n$的素数 蓝后,对$n$反复除以$prime$,同时$cnt+=n/prime$ $n!$中含有该$prime$ ...

  2. Hexo搭建 github.io 静态博客使用指南

    What? Hexo 是一个快速.简洁且高效的博客框架.可以使用markdown 解析成文章,在几秒内,即可利用靓丽的主题生成静态网页. Why? 笔记需要整理 How? github 创建 char ...

  3. 线程访问ui,托管

    1.在类中声明 delegate void setDebugDelegate(string info);//线程访问textbox委托函数 private void setDebug(string i ...

  4. 在MyEclise中使用自己安装的tomcat

    ·将Tomcat配置到MyEclipse中 1.在MyEclipse中打开Window子选项Preferences: 2.在Preferences面板中,点击左边选项中的MyEclipse,找到Ser ...

  5. hdu 1498 50 years, 50 colors 最小点覆盖

    50 years, 50 colors Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. 关于 Flutter的Button按钮没有高度设置

    flutter 里面 RaisedButton.FloatingActionButton.FlatButton.OutlineButton 中四个button都无高度设置,如下用RaisedButto ...

  7. Linux删除(清空)正在运行的应用日志文件内容 及 查看服务器剩余空间

    在测试环境定位问题时,如果发现日志文件内容太多或太大,有时需要删除该日志,如Tomcat,Nginx日志.以前每次都是先rm -rf ***.log,然后重启应用.直到后来发现了以下命令,原来可以不用 ...

  8. MySQL查询in操作排序

    in操作排序 先说解决方案: select * from test where id in(3,1,5) order by field(id,3,1,5); 或许有人会注意过,但我以前真不知道 SQL ...

  9. idea中解决Git反复输入代码的问题

    打开git终端,或者idea中的插件终端,输入命令: git config --global credential.helper store 借用一下别人的图不要介意哈.......... 执行上述命 ...

  10. SVN 提交代码时强制加入注释内容

    参考: 关于SVN提交强制加入注释 方式一是使用的服务器脚本,对所有SVN用户生效. 方式二是使用本地钩子,仅对当前SVN用户生效.