Swift.栈的压入、弹出序列

题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) i c } m l p a o s r s f } t u F n F o c o r v v w } r u 2 i / a a a h e n 2 s 辅 r r r i t d S S 助 l u a o t 栈 s p p e l w } i } r t l a , t u o e h f n i u c 取 a s p p t i o t k 弹 c h I o l s t n i P 出 k I n p p e i } s p t s p r o u 序 n d I o f t u a t o u n s 列 = d e n p s a s c a p e h 的 e x d F t p c h k c I { A 首 [ x e i a u r k I . k n n 位 I = x r c s e . n l . d d , n = s k h t a d a p e P 等 t 0 < t . I u p e s o x o 于 ] 0 = l n r p x t p p 栈 ( = a d n e L + ( 顶 ) p s e n + = a = _ 就 o p t x f d = = s 弹 p o a ( t 1 p 出 S p ! > l p 1 p ( u 。 t S = s u o ) s a t p e s p h c a p u h F S k c o s S i t . k p h t r a c [ F S a s c o p i t c t k u o r a k : n p s c [ { t I t k p [ n . u I - d { c s n e o h t 1 x u I ] ] n n , { t d _ e - x p ] o 1 ) p S { t a c k : [ I n t ] ) B o o l { 算法思想:如果第二个序列中当前要判断的元素刚好与栈顶元素相等,则直接pop出来,如果不等,则将第一个序列的后面还没有入栈的元素入栈,直到将与之相等的元素入栈为止,如果第一个序列的所有的元素都入栈了,还没有找到与之相等的元素,则说明第二个序列不是第一个序列的弹出序列, ...

2015-07-12 · 2 min · 402 words · cubegao

Swift.包含min函数的栈

题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 i c } m l p a o s r s v v i } f } f } f } t a a n u u u F r r i n n n F o t c c c o r s m ( s s i } s s i } s m r i } r u 2 t i ) e e p f e e p f e i e g f e n 1 a n l l u l l o l n t e t d S c : { f f s n f f p s f u t s u a o k . . h m . . ( e p r . = r M e p r r t l : I s m ( < i s s ) l r e s n i l r e n i u n t i _ n t t f i t t s n f i t o t A t a n m a a . n u a e s ( . n u s n i r c n i = c c s t r c l e ) s t r e o r k = : n k k t ( n k f l t ( n l n a n . . I a " . . f a " f y = I I { a a n c s 0 p s . c s 0 . { < n n p p t k t o t s k t s I [ t t p p . a p a t I . a t n I . ) e e { c c L c a n c c a t n m n n o k a k c t o k c > t a { d d u . s . k u . k ] x ( ( n c t l . { n c . ( n m t o ( a p t o l ) ) i u ) s o u a n = n t p = n s ) = t ! L = t t = a = ! 0 = s 0 = 0 t 0 { " ( { " ) ) ) ! 算法思想:利用数组模拟一个栈。 ...

2015-07-12 · 2 min · 410 words · cubegao

Swift.顺时针打印矩阵

题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. i c } m l p a o s r s f } f } t u u F n n F o c c o r g } l l v w } l l i } i } i } i } u 2 p u e e a / h p e e / f / f / f / f n 0 r a t t r 每 i r t t 打 打 打 打 d S i r 次 l i 印 s 印 s 印 e 印 e a o n d r r c s 的 e p s n e e 从 t v w } 从 t v w } 从 n v w } 从 n v w } t l t e o o t 起 r t t n n s a a h s a a h e d a h e d a h i u M n t w l a 点 c i a M d d t r r i t r r i n X r i n Y r i o t a . u s s r 左 o n r a X Y a t l a t l d l d l n i t c r t 上 l t t t r i e p i r i e p i X > i e p i Y > i e p i o r o n = = 角 s M r = = t < n r n t < n r n - = n r n - = n r n n i u = ( a + i - = d i i d - = d i i d > d i i d > d i i d x n n n s > t = x c r > e n n e > e n n e s e n n e s e n n e { C t . [ 0 t r ( o o e e x d t x e x d t x s t x d t x s t x d t x l c 0 a s i 1 _ l w n n e ( e n e ( t a e ( t a e ( o > o ] r t x d d = x n + n d = x n + a r = x n - a r = x n - c u . t a ( n - - X X [ = d Y [ = r t [ = r t [ = k 0 n c , r n : , s < s Y s < i t e > e t e > i w t o s t , 1 1 最 { t = t 1 , { t = n 1 , { n = n 1 , { n n 1 i e u t [ 上 a a 最 a d 最 d d 最 d s d s l n a r [ - - 一 r e r 右 r e e 下 X s Y 左 Y t e e s t r o I 行 t n t 一 t n x 一 t ] 一 a x l e t 2 w n s s d ] 列 d ] 行 - a [ 列 - r ] y ) s t t t X [ + Y [ r i t [ ( { & , ] a a i e 1 t n 1 s _ & ] r r { n 1 { n d { t c , t t d d { e a n r o _ e X x r : o l x ] ] t w s r ] ) ) ] [ s , o ) ) [ w I > s : n t t s a I ] t r n ] a t t ) r ) , t _ { c o 2 l : { I n t , _ s t a r t : I n t ) { 算法思想:先得到矩阵的行和列数,然后依次旋转打印数据,一次旋转打印结束后,往对角分别前进和后退一个单位。 ...

2015-07-11 · 4 min · 743 words · cubegao

Swift.二叉树的镜像

题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。 i c } m l p a o s r s f } t u F n F o c o r i } l r r i } i } r u 1 m f e o o f f e n 9 i t o o t d S r r t t r r u a o r o r t ? ? o m o m r t l o o e e . . o i o i n i u r t t m l r t r t r o t T u p e i ? r ? r r n i r = r f g . o . o o o e = n = t h l r r r o n e t e T i T t N n n r = f r g r { o i i o = t e h e d l l o r e t e e t o t ! N N ( ? o e = o ! o _ . t m d = d l ? p n e e r ( e . i ( n ( o r f r l r i r o o t i o l o t o g { o o : t h t { t ? t ? ? T . . . r l l r e e e i e f f g N t t h o ) t d = ) e = ? ) n i l & T & r e r e o N o o t d ? e . ? r i { g h t = = n i l ) { 算法思想:递归,利用栈结构。交换左右孩子,然后递归访问左右孩子。 ...

2015-07-10 · 2 min · 300 words · cubegao

Swift.树的子结构

题目描述:输入两颗二叉树A,B,判断B是不是A的子结构。 i c } m l p a o s r s f } f } t u u F n n F o c c o r v i } r i } i } i } r u 1 i a f e r f f f e n 8 s r t u t d S S p u n q p p u a o u r R i } i } i } r S R r R r R r r t l b e o f f f n u o e o e o e n i u T s o b o t o t o t o t r t p ! ! r T t u t u t u r n i e = R r r r r r e r r r ? r u o e ! o e e e e e s e = n = n . n n n N f = o s s s s s e = = v S o a t N t f a f u { d l n ? = { = { = o n r n a l a b e s i . d i u i l l T ( e l v r i i e l e l s ! s r _ a u s s ( e = e e & l n S S _ { { e p & S u u q N R = u b b p R o o q = b T T R o d o R T r r o o e t o q r e e o t ( : o R e e e t ? p t o e N N : . R T o N o o v o r ! t o d d T a o e = ? d e e r l t e . e ( ( e ? N n v ( p p e { . o i a p R R N l d l l R o o o e e o o o d f ? { { o t t e t , t ? ? ? , _ , . . , q l r _ R q q e i o R R f g q o o o t h R t o o , t o ? t t , o . : ) q t l R q : e T o R f r o o T t e t o r ) e ) t e & N ) e & o N r d o u e d n ? e S ) ? u ) b T r e B e o B N o o o l o d l e { ( { p R o o t ? . r i g h t , q R o o t ? . r i g h t ) 算法思想:遍历到最后,节点为空那就是子结构,相反不是。 ...

2015-07-10 · 3 min · 523 words · cubegao

Swift.合并两个排序的链表

题目描述: i c } m l p a o s r s f } f } t u u F n n F o c c o r i } i } v v v i } } v w } i } i } r i } i } v i } } r u 1 m f f a a a f e a h f f e m f f a f e e n 7 e r r r l r i t e r l t d S r h h p s l p q u r h h h s u a o g e r e r n p q H n p e n q t e i } } t H t H t r g e r e r n e n n e n n r t l e a e a e e H H e e H e H e f e e e e e e n e a e a e e a e e e e n i u L d t d t w e e a w e { w e m p l m a m a m L d t d t w d w w { w w o t i 1 u 2 u H a a d H a H a p H p s p d p d p n i 1 u 2 u H 1 H H H H n n i s r r e d d ! e d e d H e H t p e t q H H H e s r r e ! e e e e e o t = n = n a . a a e a e e H e H e ! e ! e w t = n = n a . a a a a w n N = = d = = v d = d = a d a m e { m e a = a = a H N = = d v d d d d H o h h a d d p a p a d d d e o h h : a ? ? e { d n e n e : h h l = p = q ! ! H d H d n ? n ? a d n e n e l = . = . a e i a i a e e H H = = . e e = i . i . d e i a i a L n n d ( l d l d L a a < p e q e v a = a = l n l n 2 l d l d i < h e h e _ 2 1 i d d H a H a n n a d d t e e ( 2 1 s e x e x { { s 1 2 q e d e d e i l ? p ? q e { x { x _ { { t h a t a t h t H a ? a ? w l . H . H m t t N e d d e N e d . d . H < n e n e p h o a 1 = 2 = a o a n n e & e a e a H = = e d d d d d e e a & q x d x d e a e 2 m m 1 e ! x x d H t ? t ? a p q d ? ! e e : ? . t t q e . . d H H 1 . r r v H a = n = n ? e e : = v g g L = a e d e e . a a a e e i l a ! p x q x n d d L n l L L s n d . H t H t e i i i i t i { v e e x s l { s s N l ! a a a t t t t o = l d d N N N d o o o e n { d d d ? i e e e , l ? 2 2 _ , ( ( { _ h h h e e e h a a a e d d d a 1 1 2 d ? , : 2 . : n h L e e i L x a s i t d t s , 2 N t ? o N h . d o e n e d a e ? e d x ) ? 2 t ) ) ) L i L s i t s N t o N d o e d ? e ? { { 算法思想:有点类似合并两个排序数组。递归的话,相对好理解一点。 ...

2015-07-09 · 5 min · 854 words · cubegao

Swift.链表中倒数第K个节点

题目描述:链表中倒数第 K 个结点。 i c } m l p a o s r s f } t u F n F o c o r g } v v v w } i } r u 1 r u a a a h f e n 5 e a r r r i t d S v r l i u a o e d r i p q e p i } i r r t l r e f < e n i u s h t = = = p = + t o t e e u ? i = k u q n i d a r 0 h h . p q r o K d n e e n ? > 1 - n n ( a a e . = = _ ! n d d x n 1 n { = i t e k q i h l x ? { l e n ! t - . a i = n d l 1 e : n x & i { t L & l i s k { t N ! o = d e 0 ? , e _ l s k e : { I n t ) L i s t N o d e ? { 算法思想:设链表的长度为 N。设置两个指针 P1 和 P2,先让 P1 移动 K 个节点,则还有 N - K 个节点可以移动。此时让 P1 和 P2 同时移动,可以知道当 P1 移动到链表结尾时,P2 移动到第 N - K 个节点处,该位置就是倒数第 K 个节点。 ...

2015-07-08 · 2 min · 249 words · cubegao

Swift.反转链表

题目描述:1->2->3->4,4->3->2->1 i c } m l p a o s r s f } f } t u u F n n F o c c o r i } v v p w } h r i } l h h r u 1 r f a a r h e e r f e e e e n 6 e r r e i a t e t a a t d S v h l d u v h d d u a o e e r p c = e l c p c ? r e e r n ? ? r t l r a e r u e u r u . n r a e e . . n i u s d t e r n c t r e r n s d t w n n o t e u i u ? e p e u H e e n n i d = r : = l r t . = = x r d = r e x x e o L = n m n t e L = n a t t w n i L h ! p e c t i d ? H s n h i e = x u m = s n n . = e { t i e s a = t r p t i i = n a N l a t d n n N l l e n d o d N i c = i o r x i d o l u l d e t l e d r p e v ( e { ? r 2 e = _ h ? . e ( h r e n _ e s h h a e a e e e d x h d d a a ? t e ? L d d . a . i : n d n s e : e t L x x N i t L t o s i d t = s = e N = t = 2 o N ( d n o n h e i d i e ? l e l a ) ? d { ) { ? . n e L x i L t s i ) t s N t o N d o e d ? e ? { { 算法思想:迭代的话,使用使用头插法。 ...

2015-07-08 · 2 min · 414 words · cubegao

Swift.调整数组顺序使奇数位于偶数前面

题目描述:调整数组顺序使奇数位于偶数前面。 i c } m l p a o s r s f } t u F n F o c o r v v v w } r u 1 R a a a h e n 4 e r r r i t d S o l u a o r s l r e w } w } l s s l r r t l d e i h h e [ [ e i n i u e = f g l i i t l r f g o t r t h e l l e i t h s n i O n t f e l e r t f g t o d = t e i e t h + n d = l f l g m ] t = - E 0 < e t e h p ] = { v n f f t = 1 e . r t + t = = 1 n c i = - s ( o g < < = s [ t _ u h 1 [ r e n t r r 1 l i m n t i i e g p : { g g f h - h h t t [ t t ] ] I 1 n & & t & & ] ) s s [ [ l r e i f g [ t h I ] t n ] t % ] % 2 { 2 ! = ! = 0 1 { { 算法思想:两个指针一个从头一个尾,然后奇数偶数交换位置。 ...

2015-07-08 · 2 min · 268 words · cubegao

Swift.在0(1)时间删除链表节点

题目描述:在 O(1) 时间内删除链表节点 i c } m l p a o s r s f } t u F n F o c o r v i } i } } } r u 1 d a f f e e n 3 e r l e t d S l p p s l u a o e p r D p p e p s l w } p p r t l t = e e / D D / e / e h ? n i u e = = t l 删 e e i 删 = 删 t i . = o t N u e 除 l l f 除 { 除 l n p n i o h n r t 的 e e 的 n 的 s e p e s o d e i n e 不 t t p 是 i 是 x n e a l d 是 e e 头 l 尾 = p = t ( d p ? 尾 d d = 结 节 ? { _ . 节 ? ? = 点 点 p . p = n 点 . . = , n ? h e v n 只 e . n e p x a e p 有 x n i a D t l x D 一 t e l d e t e 个 x : l ! = l 节 ! t e = = e 点 = L t ( t = i e n p p e s d i D D d p t l e e D N = l l { e o = { e e l d t t e e n e e t ? i d d e , l ? ? d _ . . { n n { p e e D x x e t t l ? ? e . . t v n e a e d l x : ) t ! L i s t N o d e ? ) L i s t N o d e ? { 算法思想:① 如果该节点不是尾节点,那么可以直接将下一个节点的值赋给该节点,然后令该节点指向下下个节点,再删除下一个节点,时间复杂度为 O(1)。 ② 否则,就需要先遍历链表,找到节点的前一个节点,然后让前一个节点指向 null,时间复杂度为 O(N)。 ...

2015-07-07 · 2 min · 366 words · cubegao