数据结构与算法之字符串: LeetCode 20. 有效的括号 (Ts, Py, Go, Java版)

GLM-5.1深度解析:AST感知、渐进压缩与Coding Plan工作流重构 大语言模型在代码生成任务中,已从单纯扩大参数量转向对编程本质的结构化建模。其核心在于理解抽象语法树(AST)、管理长上下文的智能压缩机制,以及将模型能力嵌入真实开发工作流的技术协议。GLM-5.1通过AST-aware分词器实现语义连贯的代码补全,借助渐进式上下文压缩支持20K+行级文件调试,并以Coding Plan为载体,封装CLI工具链、IDE协议适配与私有知识图谱注入,使模型真正成为可集成、可审计、可合规的工程组件。这种‘模型即工作流’范式,正推动AI编程从辅助走向协同,尤其适用于需要强规范性、高可 阅读详情

有效的括号

  • https://leetcode.cn/problems/valid-parentheses/

描述

  • 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

  • 有效字符串需满足:

    • 左括号必须用相同类型的右括号闭合。
    • 左括号必须以正确的顺序闭合。
    • 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

提示:

  • 1 <= s.length <= 10410^4104
  • s 仅由括号 ‘()[]{}’ 组成

Typescript 版算法实现

1 )方案 1

function isValid(s: string): boolean {
    // 奇数直接不合法
    if (s.length % 2 === 1) {
        return false;
    }
    const stack = [];
    const leftArr = ['(', '{', '[']
    for(let i = 0; i < s.length; i ++) {
        // 拿出当前字符
        const c = s[i];
        // 是左括号进栈
        if(leftArr.includes(c)) {
            stack.push(c);
        } else {
            // else 是右括号的情况,拿出栈顶元素(数组最后一位)
            const t = stack[stack.length - 1];
            // 对比栈顶元素和当前元素是否匹配
            const flag1 = t === '(' && c === ')';
            const flag2 = t === '{' && c === '}';
            const flag3 = t === '[' && c === ']';
            if(flag1 || flag2 || flag3) {
                // 将栈顶元素出栈
                stack.pop();
            } else {
                // 不匹配,直接退出
                return false;
            }
        }
    }
    // 字符串扫描完成, 栈应该为空,不为空则false
    return stack.length === 0;
};
console.log(isValid('()'));
console.log(isValid("()[]{}"));
console.log(isValid("(]"));
  • 解题思路
    • 对于没有闭合的左括号而言,越靠后的左括号,对应的右括号越靠前, 如 {[]}
    • 满足后进先出,可考虑用栈
    • 新建一个栈
    • 扫描字符串,遇左括号入栈,遇和栈顶括号类型匹配的右括号就出栈,类型不匹配直接判定为不合法
    • 字符串扫描完了,栈是空的就合法,否则不合法

2 )方案 2

function isValid2(s: string): boolean {
    // 奇数直接不合法
    if (s.length % 2 === 1) {
        return false;
    }
    const stack = [];
    // 用字典存储 这种方式缺点是空间复杂度较高
    const map = new Map([
        ['(', ')'],
        ['{', '}'],
        ['[', ']']
    ])
    /*
    // 这种方式是写起来繁琐
    const map = new Map()
    map.set('(', ')');
    map.set('{', '}');
    map.set('[', ']');
    */
    for(let i = 0; i < s.length; i++) {
        // 拿出当前字符
        const c = s[i];
        // 是左括号进栈
        if(map.has(c)) {
            stack.push(c);
        } else {
            // else 是右括号的情况
            // 拿出栈顶元素(数组最后一位)
            const t = stack[stack.length - 1];
            // 对比栈顶元素和当前元素是否匹配
            // 左括号===当前元素
            if(map.get(t) === c) {
                // 将栈顶元素出栈
                stack.pop();
            } else {
                return false;
            }
        }
    }
    // 字符串扫描完成, 栈应该为空,不为空则false
    return stack.length === 0; 
}
console.log(isValid2('()'));
console.log(isValid2("()[]{}"));
console.log(isValid2("(]"));
  • 基于Map这个数据结构,优化了程序的判断方式

3 ) 方案3

function isValid3(s: string): boolean {
    const dic: { [key: string]: string } = {'{': '}', '[': ']', '(': ')'};
    const stack: string[] = [];
        
    for (const c of s) {
        // 注意 in运算符可能会得到原型链上的属性,但是在这里不会出问题,所以可以忽略
        if (c in dic) {
            stack.push(c);
        } else if (dic[stack.pop() as string] !== c) {
            return false;
        }
    }

    return stack.length === 0;
}
console.log(isValid3('()'));
console.log(isValid3("()[]{}"));
console.log(isValid3("(]"));
  • 这个方案简化了上述两个方案,属于更优的算法

Python3 版算法实现

1 )方案1

class Solution:
    def isValid(self, s: str) -> bool:
        # 奇数直接不合法
        if len(s) % 2 == 1:
            return False
        
        stack = []
        left_arr = ['(', '{', '[']
        
        for c in s:
            # 是左括号进栈
            if c in left_arr:
                stack.append(c)
            else:
                # 如果栈为空,直接返回 False
                if not stack:
                    return False
                
                # 是右括号的情况,拿出栈顶元素(列表最后一位)
                t = stack[-1]
                
                # 对比栈顶元素和当前元素是否匹配
                flag1 = t == '(' and c == ')'
                flag2 = t == '{' and c == '}'
                flag3 = t == '[' and c == ']'
                
                if flag1 or flag2 or flag3:
                    # 将栈顶元素出栈
                    stack.pop()
                else:
                    # 不匹配,直接退出
                    return False
        
        # 字符串扫描完成,栈应该为空,不为空则返回False
        return len(stack) == 0

2 )方案2

class Solution:
    def isValid(self, s: str) -> bool:
        # 奇数直接不合法
        if len(s) % 2 == 1:
            return False

        stack = []
        # 用字典存储
        mapping = {
            '(': ')',
            '{': '}',
            '[': ']'
        }

        for c in s:
            # 是左括号进栈
            if c in mapping:
                stack.append(c)
            else:
                # else 是右括号的情况
                # 拿出栈顶元素(列表最后一位)
                if not stack:
                    return False
                t = stack[-1]
                # 对比栈顶元素和当前元素是否匹配
                if mapping.get(t) == c:
                    # 将栈顶元素出栈
                    stack.pop()
                else:
                    return False

        # 字符串扫描完成,栈应该为空,不为空则返回 False
        return len(stack) == 0

3 )方案3

class Solution:
    def isValid(self, s: str) -> bool:
        # 字典用于存储左右括号的对应关系
        dic = {'{': '}', '[': ']', '(': ')'}
        # 用于存储左括号的栈
        stack = []

        for c in s:
            if c in dic:
                # 如果是左括号,入栈
                stack.append(c)
            elif not stack or dic[stack.pop()] != c:
                # 如果是右括号,检查栈是否为空,以及是否与栈顶元素匹配
                return False

        # 最终栈应为空,否则有未匹配的左括号
        # return len(stack) == 0 # 这里效果一样
        return not stack

Golang 版算法实现

1 )方案1

func isValid(s string) bool {
	// 奇数直接不合法
	if len(s)%2 == 1 {
		return false
	}

	stack := make([]byte, 0)
	leftMap := map[byte]byte{'(': ')', '{': '}', '[': ']'}

	for i := 0; i < len(s); i++ {
		c := s[i]
		// 是左括号进栈
		if _, ok := leftMap[c]; ok {
			stack = append(stack, c)
		} else {
			// 如果栈为空,直接返回 False
			if len(stack) == 0 {
				return false
			}

			// 是右括号的情况,拿出栈顶元素(切片最后一位)
			t := stack[len(stack)-1]

			// 当前字符是否匹配栈顶字符
			flag1 := t == '(' && c == ')'
			flag2 := t == '{' && c == '}'
			flag3 := t == '[' && c == ']'

			// 不匹配,直接退出
			if !(flag1 || flag2 || flag3) {
				return false
			}

			// 匹配,将栈顶元素出栈
			stack = stack[:len(stack)-1]
		}
	}

	// 字符串扫描完成,栈应该为空,不为空则返回 False
	return len(stack) == 0
}

2 )方案2

func isValid(s string) bool {
    // 奇数直接不合法
    if len(s)%2 == 1 {
        return false
    }

    stack := make([]byte, 0)
    // 用 map 存储
    mapping := map[byte]byte{
        '(': ')',
        '{': '}',
        '[': ']',
    }

    for i := 0; i < len(s); i++ {
        // 是左括号进栈
        if _, ok := mapping[s[i]]; ok {
            stack = append(stack, s[i])
        } else {
            // else 是右括号的情况
            // 拿出栈顶元素(切片最后一位)
            if len(stack) == 0 {
                return false
            }
            t := stack[len(stack)-1]
            // 对比栈顶元素和当前元素是否匹配
            if mapping[t] == s[i] {
                // 将栈顶元素出栈
                stack = stack[:len(stack)-1]
            } else {
                return false
            }
        }
    }

    // 字符串扫描完成,栈应该为空,不为空则返回 False
    return len(stack) == 0
}

3 )方案3

func isValid(s string) bool {
    // 使用 map 存储左右括号的对应关系
    dic := map[byte]byte{'{': '}', '[': ']', '(': ')'}
    // 用于存储左括号的栈
    var stack []byte

    for i := 0; i < len(s); i++ {
        c := s[i]
        if _, ok := dic[c]; ok {
            // 如果是左括号,入栈
            stack = append(stack, c)
        } else if len(stack) == 0 || dic[stack[len(stack)-1]] != c {
            // 如果是右括号,检查栈是否为空以及是否与栈顶元素匹配
            return false
        } else {
            // 如果匹配,则将栈顶元素出栈
            stack = stack[:len(stack)-1]
        }
    }

    // 最终栈应为空,否则有未匹配的左括号
    return len(stack) == 0
}

Java 版算法实现

1 )基于栈的括号匹配法(辅助栈法)

import java.util.ArrayDeque;
import java.util.Deque;

class Main1 {
    public static boolean isValid(String s) {
        // 奇数长度直接不合法
        if (s.length() % 2 == 1) {
            return false;
        }

        Deque<Character> stack = new ArrayDeque<>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            // 左括号入栈
            if (c == '(' || c == '{' || c == '[') {
                stack.push(c);
            } else {
                // 右括号时,栈若为空则无法匹配
                if (stack.isEmpty()) {
                    return false;
                }
                char t = stack.peek(); // 栈顶元素

                // 检查是否匹配
                if ((t == '(' && c == ')') ||
                        (t == '{' && c == '}') ||
                        (t == '[' && c == ']')) {
                    stack.pop(); // 匹配成功,弹出栈顶
                } else {
                    return false; // 不匹配直接失败
                }
            }
        }

        // 扫描结束后栈应为空
        return stack.isEmpty();
    }

    // 简单测试
    public static void main(String[] args) {
        // 示例 1:简单的括号对
        System.out.println(isValid("()")); // 输出: true
        // 示例 2:多个不同类型的括号对
        System.out.println(isValid("()[]{}")); // 输出: true
        // 示例 3:不匹配的括号
        System.out.println(isValid("(]")); // 输出: false
        // 示例 4:嵌套的括号
        System.out.println(isValid("({[]})")); // 输出: true
        // 示例 5:奇数长度的字符串
        System.out.println(isValid("({[})")); // 输出: false
        // 示例 6:空字符串
        System.out.println(isValid("")); // 输出: true
    }
}

算法说明:

  1. 核心思想:利用栈“后进先出”(LIFO)的特性,将最近遇到的左括号与当前遍历到的右括号进行匹配。
  2. 提前剪枝:若字符串长度为奇数,括号必然无法完全匹配,可直接返回 false。
  3. 遍历与入栈:遍历字符串,若当前字符为左括号((, {, [),则将其压入栈中等待匹配。
  4. 匹配与出栈:若当前字符为右括号(), }, ]),首先检查栈是否为空。若为空,说明没有对应的左括号,返回 false;若不为空,则取出栈顶元素,判断是否与当前右括号匹配。匹配则弹出栈顶元素,不匹配则返回 false。
  5. 最终校验:遍历结束后,检查栈是否为空。若为空,说明所有括号均有效匹配,返回 true;否则说明有左括号未匹配,返回 false。

2 )哈希表辅助栈匹配法

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;

public class Main2 {
    public static boolean isValid(String s) {
        // 奇数长度直接不合法
        if (s.length() % 2 == 1) {
            return false;
        }

        Deque<Character> stack = new ArrayDeque<>();
        // 用 Map 存储括号配对(左 -> 右)
        Map<Character, Character> map = new HashMap<>();
        map.put('(', ')');
        map.put('{', '}');
        map.put('[', ']');

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            // 是左括号则入栈
            if (map.containsKey(c)) {
                stack.push(c);
            } else {
                // 右括号时,栈为空则无效
                if (stack.isEmpty()) {
                    return false;
                }
                // 取出栈顶元素(不弹出)进行匹配
                char top = stack.peek();
                if (map.get(top) == c) {
                    stack.pop();   // 匹配成功,弹出栈顶
                } else {
                    return false;
                }
            }
        }
        // 扫描完毕,栈应为空
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        // 示例 1:简单的括号对
        System.out.println(isValid("()")); // 输出: true
        // 示例 2:多个不同类型的括号对
        System.out.println(isValid("()[]{}")); // 输出: true
        // 示例 3:不匹配的括号
        System.out.println(isValid("(]")); // 输出: false
        // 示例 4:嵌套的括号
        System.out.println(isValid("({[]})")); // 输出: true
        // 示例 5:奇数长度的字符串
        System.out.println(isValid("({[})")); // 输出: false
        // 示例 6:空字符串
        System.out.println(isValid("")); // 输出: true
    }
}

算法说明:

  1. 核心思想:利用栈的“后进先出”特性处理括号的嵌套关系,同时引入哈希表(Map)存储括号映射,简化条件判断逻辑,使代码更简洁且易于扩展。
  2. 提前剪枝:若字符串长度为奇数,必然无法完全匹配,直接返回 false。
  3. 初始化映射:使用 HashMap 将左括号作为键,对应的右括号作为值进行存储。
  4. 遍历与入栈:遍历字符串,若当前字符存在于哈希表的键中(即为左括号),则将其压入栈中。
  5. 匹配与出栈:若当前字符不在键中(即为右括号),先检查栈是否为空。若为空说明无匹配左括号,返回 false;若不为空,则通过哈希表获取栈顶左括号对应的右括号,判断是否与当前字符相等。相等则弹出栈顶,不相等则返回 false。
  6. 最终校验:遍历结束后,检查栈是否为空。若为空说明全部匹配成功,返回 true;否则返回 false。

3 )哈希表与栈结合法(精简版)

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

public class Main3 {
    public static boolean isValid(String s) {
        // 括号配对字典,对应 TypeScript 中的 dic
        Map<Character, Character> dic = new HashMap<>();
        dic.put('{', '}');
        dic.put('[', ']');
        dic.put('(', ')');

        Stack<Character> stack = new Stack<>();

        for (char c : s.toCharArray()) {
            // TypeScript 的 in 运算符检查属性是否存在,这里用 containsKey 判断是否为左括号
            if (dic.containsKey(c)) {
                stack.push(c);
            } else {
                // 栈为空或栈顶的左括号与当前右括号不匹配时返回 false
                // 对应 TS 中 dic[stack.pop()] !== c,但 Java 需先检查栈是否为空
                if (stack.isEmpty() || dic.get(stack.pop()) != c) {
                    return false;
                }
            }
        }

        // 栈为空说明所有括号正确闭合
        return stack.isEmpty();
    }
    
    public static void main(String[] args) {
        // 示例 1:简单的括号对
        System.out.println(isValid("()")); // 输出: true
        // 示例 2:多个不同类型的括号对
        System.out.println(isValid("()[]{}")); // 输出: true
        // 示例 3:不匹配的括号
        System.out.println(isValid("(]")); // 输出: false
        // 示例 4:嵌套的括号
        System.out.println(isValid("({[]})")); // 输出: true
        // 示例 5:奇数长度的字符串
        System.out.println(isValid("({[})")); // 输出: false
        // 示例 6:空字符串
        System.out.println(isValid("")); // 输出: true
    }
}

算法说明:

  1. 核心思想:利用栈处理括号的嵌套关系,同时使用哈希表(字典)建立左右括号的映射,使匹配逻辑更加紧凑。
  2. 初始化映射:使用 HashMap 将左括号作为键,对应的右括号作为值进行存储。
  3. 遍历与入栈:使用增强 for 循环遍历字符数组,若当前字符存在于哈希表的键中(即为左括号),则将其压入栈中。
  4. 精简匹配逻辑:若当前字符不在键中(即为右括号),利用逻辑或(||)的短路特性,在同一个条件语句中先检查栈是否为空;若不为空,则弹出栈顶元素并判断其对应的右括号是否与当前字符相等。若栈空或不匹配,直接返回 false。
  5. 最终校验:遍历结束后,检查栈是否为空。若为空说明所有括号均正确闭合,返回 true;否则返回 false。
AI编程辅助选型实战:Claude Code、DeepSeek-R1与Kimi工程化对比 AI编程辅助并非简单选择‘更强模型’,而是面向真实软件工程场景的技术适配问题。其核心在于理解大语言模型在代码生成、错误诊断、文档补全与跨文件重构等任务中的原理差异,以及上下文建模能力、token解析鲁棒性、延迟与成本约束等技术价值。在CI/CD集成、单元测试自动生成、遗留系统注释增强等典型应用场景中,不同模型因训练数据分布、推理优化策略和API服务设计而表现分化显著。本文基于6个落地项目经验与17次线上事故复盘,聚焦DeepSeek-R1、Claude Code和Kimi三者的工程级能力边界,揭示如何在响应 阅读详情

相关推荐

GLM-5.1实战指南:国产大模型如何支撑生产级AI编程

AI编程正从‘能写代码’迈向‘可交付代码’的关键阶段。其核心在于模型对真实工程场景的理解能力——不仅需掌握语法与算法(如HumanEval基准),更需建模上下文依赖、跨语言协同、安全合规等隐性知识。GLM-5.1通过CodeGraph知识图谱深度融入百万级开源项目决策逻辑,在遗留系统重构、接口对齐、合规审计等企业高频场景中展现强实用性。它不追求通用NLP指标的绝对领先,而是以‘可嵌入CI/CD’‘可直合主干’‘可过AST验证’为技术标尺,将AI编程从评测幻觉拉回工程现实。本文聚焦GLM、Claude等主流模

376

Qwen3.6-Plus:面向工程落地的国产编程模型深度解析

编程辅助模型正从‘代码补全’迈向‘工程意图理解’——这一技术演进本质是将大模型能力与真实开发场景深度耦合。其核心原理在于上下文感知增强、AST-aware语义建模与可验证代码契约机制,显著提升生成代码的可维护性、安全性与风格一致性。技术价值不仅体现为效率跃升,更在于降低工程决策成本、缩短PR评审周期、强化合规边界控制。典型应用场景覆盖IDE实时辅助、CI/CD智能守门、遗留系统现代化重构及多语言客户端自动生成。本文聚焦Qwen3.6-Plus这一国产编程模型在上下文感知与工程化落地方面的实践突破,解析其如何

weixin_30530939的博客 358

从投影到抗噪:直线拟合三大算法实战指南

本文深入解析了直线拟合的三大核心算法:常规最小二乘法(OLS)、正交回归(TLS)和RANSAC。通过对比其几何原理、代码实现与适用场景,为计算机视觉和数据分析领域的实践者提供了清晰的选型指南,帮助在抗噪、旋转不变性等不同需求下,精准选择并应用最合适的算法。

ujm567890的博客 576

数据结构与算法笔记:字典序最大问题分析

字典序最大问题 问题描述 给定一个1到n的排列(无序状态的),依次插入到栈中,在每时每刻都可以多次从栈中弹出栈顶 问:应如何使得弹出栈顶的序列的字典序最大,并输出这个序列 问题分析 什么是字典序 比如两个序列:5,4,3,2,1和1,2,3,4,5 这两个中第一个的字典序最大 每个位置上的数字比其他序列上同一位置的数字要大 比如:第一位置中5比1大,第二位置中4比2大这样 即:字典序最大 = 从左向右看这个序列,每个数字都尽量大 题目给定一个1到n的排列,每个数字只出现一次 要使出栈的字典序最大

Wang的专栏 4393

保姆级教程:用ArcGIS Pro搞定云南30米分辨率DEM地形图(附数据下载与配色方案)

本文提供了一份详细的ArcGIS Pro教程,指导用户如何制作云南30米分辨率DEM地形图。从数据下载、预处理到镶嵌与质量控制,再到地形分析与可视化,全流程覆盖云南复杂地形的处理要点。特别包含数据下载链接、配色方案及常见问题解决方案,适合地理信息分析新手和专业人士。

weixin_30467199的博客 309

如何优雅地进行频谱分析—— 一行代码实现绘制MATLAB频谱、功率谱图

之前的文章里讲了关于信号频谱、能量谱的相关理论和MATLAB编程实现方法: Mr.看海:信号频域分析方法的理解(频谱、能量谱、功率谱、倒频谱、小波分析) Mr.看海:频域特征值提取的MATLAB代码实现(频谱、功率谱、倒频谱) 不过对于刚刚开始进行这方面研究,或者对MATLAB不甚熟悉,抑或者不想花太多时间用在编程这件事上的同学,目前缺少一种足够便捷、高效、可靠的代码。 所以笔者想做这样一件事:编写一个函数,同学们只需要导入自己要分析的数据,并按照自己的需求设置部分选项,调用一行代码就可以实现绘制频

fengzhuqiaoqiu的博客 2万+

数据结构与算法笔记:农夫过河问题python3实现

问题描述 农夫(Human)过河。一个农夫带着一只狼(Wolf),一只羊(Sheep)和一些菜(Vegetable)过河。河边只有一条船,由于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊要吃菜,请问农夫如何才能使三样东西平安过河? 要求: 输出一行,为最终的过河方式,方案格式为 过河人员、回来人员、过河人员、回来人员、…、过河人员。 过去和回来的人员之间,用空格隔开。 以四...

Wang的专栏 3374

全双工AI语音交互:从原理到实践,构建实时对话系统

语音交互技术正从传统的半双工模式向全双工模式演进,以实现更自然、实时的对话体验。全双工交互的核心原理在于模拟人类电话通话,允许双方同时发送和接收音频流,这需要流式语音识别(Streaming ASR)和实时自然语言理解(Real-time NLU)技术的深度整合。其技术价值在于显著降低交互延迟,支持智能打断(Barge-in),从而提升人机对话的流畅度和自然度。在应用场景上,全双工技术是智能助手、实时翻译、车载语音及无障碍交互等领域的关键突破。本文以微软MAI Realtime等模型为例,探讨如何利用开源技

weixin_33693070的博客 404

数据结构与算法笔记:计算思维之经典农夫过河问题C++实现

农夫、羊、狼、菜的过河问题 问题描述 角色:农夫,羊,狼,菜 条件1:船很小,只能装下农夫和其他一个角色 条件2:无人看管,羊吃菜,狼吃羊 问:如何让其他三种角色被农夫平安带着过河? 相关分析 我们可以先用人脑尝试一下相关渡河策略 1 ) 先渡狼,人回来再渡菜,人回来再渡羊 2 ) 先渡菜,人回来再渡狼,人回来再渡羊 以上两种很好想到,而且我们可以知道羊这种角色是不能先渡河过去的,羊需要最后再渡 如果先渡了羊了,之后再渡任何其他角色,都要将羊带回来 可以参考小游戏:http://gameschool

Wang的专栏 3312

Star CCM+ 202206 (17.04) 详细安装步骤

StarCCM+ 17.04 安装包和详细安装步骤

薛定谔的alpha狗 3万+

Python的单元测试之unittest

是一个功能类似 unittest 的库,它集合众家标准测试库之所长,和 unittest 相比,功能更为强大,使用更为简单,OpenStack 广泛的利用它编写单元测试。unittest 提供了自动匹配发现并执行测试用例的功能,随着项目代码结构越发庞大,势必有多个测试文件,自动匹配发现并测试用例的功能在此就显得非常有用,只要满足。unittest 提供了丰富的命令行入口,可以根据需要执行某些特定的用例。的测试用例都会被 unittest 发现并执行,测试用例文件的默认匹配规则为 test*.py。

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 283

数据结构与算法笔记:图搜索之DFS详解

图搜索 Graph Search 图搜索的分类 BFS广度优先(宽搜) DFS深度优先(深搜) !!!本文详解!!! 深度优先搜索DFS 深度优先遍历DFS, 这个策略其实是非常stupid or simple的,比BSF要简单的多 同样,我们可以通过一个故事来开始 在古希腊神话中, Ariadne是Crete的国王Minos的公主,她给忒修斯(Theseus)一个线团 使得忒修斯成功进入迷宫杀死牛头怪兽,但事后忒修斯抛弃了她 这是一个有道德意义的故事又或者存在不同的版本, 但不是我们的研究的对象

Wang的专栏 3118

全网唯一OpenCyphal/UAVCAN教程(8)libcanard介绍

当Cyphal里,这个结构体代表一条完整的Cyphal消息,之后我们会根据metadata里提供的元信息,其实就是消息ID,调用对应的反序列化函数,将payload还原成具体的Cyphal消息。用于构造一个新的发送队列,原则上一个can物理接口需要分配一个发送队列,如果它们的MTU大小一致,是可以共用一条的。这个库不包含IO层,是平台无关的,意义是没有实现具体的数据收发,仅提供将发送出去的Cyphal消息转成can帧,以及将收到的can帧转成Cyphal消息。返回值是这条消息拆解成的can帧的数目。....

二进制君 2409

数据结构与算法笔记:计算思维之人鬼渡河问题

人鬼渡河问题 1 ) 问题描述 目标:将东岸的3人3鬼通过一只小船安全转移到西岸,希望摆渡次数尽可能少 条件 船的容量有限,一次最多只能坐2人(或2鬼或1人1鬼) 无论是在河的东岸还是在河的西岸,一旦鬼数多于人数,则人将被鬼吃掉 怎样渡河的大权掌握在人的手中 说明:划船的时间忽略不计。船一靠岸即将船与岸视为一体,人和鬼即使还没有下 船也视为已上岸 任务:编写程序,求出一种渡河方案 备注:图片托管于github,请确保网络的可访问性 2 ) 分析 目标是找

Wang的专栏 2447

创新引入HAttention模块:提升YOLOv8小目标检测精度【YOLOv8】

YOLOv8在前几个版本的基础上进行了多项优化,特别是在模型的速度和精度上做了较大改进。改进的backbone:引入了更加高效的骨干网络(backbone)设计,如更深的网络层和更高效的特征提取模块。增强的Neck模块:使用了PANet等机制来更好地融合不同尺度的特征,增强了多尺度目标检测能力。增强的Head模块:包括多头检测头,以便针对不同大小的目标进行更精细的预测。尽管如此,YOLOv8仍面临着在小目标检测精度上不如大型目标的挑战,尤其在复杂背景或高密度目标环境下。

博客 2770

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数据结构与算法之二叉树: LeetCode 701. 二叉搜索树中的插入操作 (Ts版)

1 ) 方案1:模拟。2 ) 方案2:递归。

Wang的专栏 2270

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数据结构与算法笔记:计算思维之下楼梯台阶和象棋跳马问题

下台阶问题 1 ) 问题描述 从楼上走到楼下共有 h 个台阶,每一步有三种走法 走一个台阶; 走二个台阶; 走三个台阶。 问:一共可以走出多少种方案? 即共要多少步? 每一步走几级台阶? 2 ) 分析 初始思路 我们根据题目给定的场景,先简单模拟一下,设定 h=4h=4h=4 备注:图片托管于github,请确保网络的可访问性 如上图所示, 这里有4阶楼梯, 红色数字代表每一步走几级台阶 这里枚举了4层台阶的所有可能情况, 但是不管具体有几级台阶,下

Wang的专栏 2111

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python笔记:滑动验证码的识别算法

概述 用程序识别极验滑动验证码的验证,包括分析识别思路、识别缺口位置、生成滑块拖动路径、模拟实现滑块拼合通过验证等步骤。 准备工作 使用Python库是Selenium,浏览器为Chrome。请确保已安装Selenium库和ChromeDriver浏览器驱动。 关于极验滑动验证码: 极验滑动验证码官网为:http://www.geetest.com/ 验证方式为拖动滑块拼合图像,若图像完全拼合...

Wang的专栏 2103

数据结构与算法之堆: LeetCode 295. 数据流的中位数 (Ts版)

/ 返回 1.5 ((1 + 2) / 2)中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。3 ) 方案3:有序集合 + 双指针。2 ) 方案2:优先队列-优化版。1 ) 方案1:优先队列。

Wang的专栏 1907

数据结构与算法笔记:计算思维之谁做的好事与刑侦作案问题

谁做的好事 清华附中有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。 A说:不是我。 B说:是C。 C说:是D。 D说:他胡说。 已知:三个人说的是真话,一个人说的是假话。 现在请你根据这些信息,编写程序找出做了好事的人。 分析 将四个人说的四句话(自然语言)转换成计算机可以计算的式子, 可使用循环枚举的方式来判断 (1) 思路一:通过字符表示人 先定义一个字符变量 thisman 表示要寻找的做了好事的人的“名字(代号)”(A、B、C、D),即 char this

Wang的专栏 1829

数据结构与算法笔记:图搜索之BFS详解

图搜索 Graph Search 图搜索的分类 BFS广度优先(宽搜) DFS深度优先(深搜) 广度优先搜索BFS 我们可以用比喻来说明广度优先搜索算法 在一片草木枯黄的深秋草原上,在草原的某一处出现了一处野火 一开始的时候野火集中于一点之上,在这点野火耗尽当前植被变成灰烬之前点燃了周围的植被 比如节点s是初始火种,假设我们手中有一个秒表,每过1秒,我们的大火会向外迈进一步 这个过程只能向外,不能向内,因为只能点燃植被,不能把灰烬点燃 蓝色的点是即将变为灰烬的点,红色的点是刚被点燃的点,灰色的圆形或

Wang的专栏 1791

数据结构与算法之动态规划: LeetCode 1494. 并行课程 II (Ts版)

给你一个整数 n 表示某所大学里课程的数目,编号为 1 到 n ,数组 relations 中, relations[i] = [xi, yi] 表示一个先修课的关系,也就是课程 xi 必须在课程 yi 之前上。解释:上图展示了题目输入的图。一个最优方案是:第一学期上课程 2 和 3,第二学期上课程 4 ,第三学期上课程 1 ,第四学期上课程 5。然后第二个学期上课程 1 ,第三个学期上课程 4。在一个学期中,你 最多 可以同时上 k 门课,前提是这些课的先修课在之前的学期里已经上过了。

Wang的专栏 1749

数据结构与算法笔记:求直方图最大面积算法分析

直方图最大面积 问题描述 有n列的直方图,第j列高度为hjh_jhj​, 求一个面积最大的子矩阵 备注:图片托管于github,请确保网络的可访问性 格式要求 输入第一行正整数n,第二行n个空格隔开的非负整数 数据范围: 所有直方图的列不会超过30000 关键算法实现 1 ) 算法1:时间复杂度为: O(n3)O(n^3)O(n3)的实现 分析 矩形面积为底和高的乘积 底部从a到b,那么底边长为: b-a+1 高为:min{hi∣a≤i≤b}min \{h

Wang的专栏 1664

数据结构与算法之LRU: 实现 LRU 缓存算法功能 (Ts, Py, Go版)

LRU - Lease Recently Used 最近使用如果内存优先,只缓存最近使用的,删除 ‘沉睡’ 数据核心 api: get set分析。

Wang的专栏 1599

数据结构与算法之贪心: LeetCode 455. 分饼干 (Ts, Py, Go版)

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j]。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。2 )排序 + 双指针 + 贪心。1 )排序 + 遍历。

Wang的专栏 1566
上一篇: 数据结构与算法之字符串: LeetCode 696. 计数二进制子串 (Ts, Py, Go, Java版)
下一篇: 数据结构与算法之数组: LeetCode 17. 电话号码的字母组合 (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值