黄哥Python提醒:没有学过数据结构和算法的不要着急刷题

362 阅读1分钟
原文链接: zhuanlan.zhihu.com

很多人学习编程急于求成,猴急猴急的,要知道欲速则不达。

在没有学习数据结构和算法之前,不要着急刷题。不然题目看不懂,刷题写的代码通不过测试。

下面以leetcode 上这个题目为例说明这个问题。

Valid Parentheses - LeetCodeleetcode.com图标

这个题目需要学习了数据结构中的栈(stack) ,才能写出正确的代码。

下面是黄哥写的Go 语言代码 和Java 代码,有兴趣的朋友,可以用Python 去实现一下。

type node struct {
	data interface{}
	prev *node
}

// Stack 结构体
type Stack struct {
	top    *node
	length int
}

// New 一个栈
func New() *Stack {
	return &Stack{nil, 0}
}

// Pop 方法
func (stack *Stack) Pop() interface{} {
	if stack.length == 0 {
		return nil
	}
	n := stack.top
	stack.top = n.prev
	stack.length--
	return n.data
}

func (stack *Stack) Len() interface{} {
	return stack.length
}

func (stack *Stack) Push(value interface{}) {
	stack.top = &node{value, stack.top}
	stack.length++

}

func (stack *Stack) Peek() interface{} {
	if stack.length == 0 {
		return nil
	}
	return stack.top.data
}

// func (stack *Stack) String() string {
// 	return fmt.Sprintf("%v", stack.top.data)
// }

func (stack *Stack) Empty() bool {
	if stack.length > 0 {
		return false
	}
	return true
}
func isValid(str string) bool {
	s := New()
	openbrackets := "([{"
	bracketsMap := map[string]string{
		")": "(",
		"]": "[",
		"}": "{",
	}

	for _, char := range str {
		fmt.Println(string(char))
		if strings.Contains(openbrackets, string(char)) {
			s.Push(interface{}(string(char)))

		} else {
			str, _ := s.Pop().(string)
			if str != bracketsMap[string(char)] {
				// str, _ := s.Peek().(string)
				// fmt.Println(str)
				return false
			}
		}

	}
	if !s.Empty() {
		return false
	}
	return true
}


Java 代码

/*
 *  黄哥所写
*/
package stackdemo;

import java.util.HashMap;
import java.util.Stack;

public class Solution {
	Stack<Character> stack = new Stack<>();
	HashMap<Character , Character> map = new HashMap<>(); 
	
	 public Solution() {
		    this.map.put(')', '(');
		    this.map.put('}', '{');
		    this.map.put(']', '[');
		  }


	public static  void main(String[] args) {
	
		        String s = "()[]{}]";
		        System.out.println((new Solution()).isValid(s));		        


		 
	}
	
	public boolean isValid(String s) {
		
		for(int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			if (c == '(' || c == '[' || c == '{') {
				stack.push(c);
			}else {
				char top = stack.empty() ? '#' : stack.pop();
				if (top != map.get(c)) {
					return false;
			}
				
				
			}
			
		}

			
		return stack.isEmpty();
	        
	    }
	

}


部分免费python免费视频

哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili


如何训练自己的编程思路

pythonpeixun/article