题目描述LeetCode 1980. 找出不同的二进制字符串 给你一个字符串数组 nums,其中有 n 个 互不相同 的二进制字符串,且每个字符串长度都为 n。 请返回一个长度为 n 且没有出现在 nums 中的二进制字符串。若有多个答案,返回任意一个即可。 示例 1: 输入:nums = ["01","10"] 输出:"11" 解释:"11" 不在 nums 中,"00" 也是合法答案 示例 2: 输入:nums = ["00","01"] 输出:"11" 解释:"11" 不在 nums 中,"10" 也是合法答案 示例 3: 输入:nums = ["111","011","001"] 输出:"101" 解释:"101" 不在 nums 中,"000"、&qu ...
题目描述LeetCode 1888. 使二进制字符串字符交替的最少反转次数 给你一个二进制字符串 s,你可以按任意顺序执行以下两种操作任意次: 类型 1:删除字符串 s 的第一个字符并把它追加到末尾。 类型 2:选择字符串 s 中任意一个字符并将其反转('0' 变 '1','1' 变 '0')。 请返回让 s 变成交替字符串的前提下,类型 2 的最少操作次数。 我们称一个字符串是交替的,当且仅当任意相邻字符都不同。 示例 1: 输入:s = "111000" 输出:2 示例 2: 输入:s = "010" 输出:0 解题思路核心观察这题难点是“可以先做若干次轮转,再做翻转最小化”。 把字符串轮转看成在 s+s 里取一个长度为 n 的窗口: ss := s + s 每个长度为 n 的窗口,都对应 s 的一种轮转结果。 对于固定窗口,要变成交替串只需要比较两种目标模式: 以 0 开头:010101... 以 1 开头:101010... 窗口中与目标串不一致的位置数 ...
前言Go 语言的并发模型是其最大的特色之一。在 Go 中,有两种主要的并发同步方式: Channel:通过通信共享内存(Go 推荐) sync 包:通过共享内存通信(传统方式) 前者更安全,后者更灵活(但易出错)。本文将深入对比这两种方式,帮助你在实际开发中做出正确的选择。 一、核心定位与设计理念 特性 Channel sync 包 设计理念 通信优先,同步为辅 同步优先,通信为辅 核心思想 不要通过共享内存通信,要通过通信共享内存 共享内存 + 锁/信号量实现同步 安全性 天然避免数据竞争(编译/运行时检查) 手动控制,易出现死锁/数据竞争 易用性 简单直观,符合 Go 并发哲学 需理解底层同步原理,易出错 设计哲学对比Channel 的哲学: 12"Don't communicate by sharing memory; share memory by communicating."不要通过共享内存来通信,而要通过通信来共享内存。 这是 Go 语言的核心并发理念,强调通过消息传递(Chan ...
后端开发
未读后端极速转职Golang工程师:核心知识与实战指南一、Golang 环境安装与模块管理1. 环境安装与配置 下载地址:官网 https://golang.org/dl/ 或 国内镜像 https://golang.google.cn/dl/ Linux配置:解压源码包至 /usr/local,并配置 ~/.bashrc:123export GOROOT=/usr/local/goexport GOPATH=$HOME/goexport PATH=$PATH:$GOROOT/bin:$GOPATH/bin 开发环境检测:执行 go version。推荐 IDE 为 Goland 或 VSCode+Go插件。 2. Go Modules 依赖管理 (核心)Go 1.11 引入,淘汰了传统的 GOPATH 模式,解决无版本控制、依赖冗余等问题。 核心环境变量: GO111MODULE=on:强制开启模块模式。 GOPROXY="https://goproxy.cn,direct":设置国内代理,加速下载。 GOPRIVATE="git.example.com ...
题目描述LeetCode 1784. 检查二进制字符串字段 给你一个二进制字符串 s,该字符串不含前导零。 如果 s 包含零个或一个由连续的 '1' 组成的字段,返回 true。否则,返回 false。 示例 1: 输入:s = "1001" 输出:false 解释:由连续若干个 '1' 组成的字段数量为 2,返回 false 示例 2: 输入:s = "110" 输出:true 解释:由连续若干个 '1' 组成的字段数量为 1,返回 true 解题思路核心观察题目要求判断字符串中的 '1' 是否只形成一个连续字段。换句话说: ✓ 允许:"111"、"1110"、"0111"、"01110"(1 只出现一次连续段) ✗ 不允许:"1001"、"10101"、"11011"(1 出现多次连续段) 关键发现如果字符串中存在 " ...
题目描述LeetCode 1758. 生成交替二进制字符串的最少操作数 给你一个仅由字符 '0' 和 '1' 组成的字符串 s。一步操作中,你可以将任一 '0' 变成 '1',或者将 '1' 变成 '0'。 交替字符串定义为:如果字符串中不存在相邻两个字符相等的情况,那么该字符串就是交替字符串。例如,字符串 "010" 是交替字符串,而字符串 "0100" 不是。 返回使 s 变成交替字符串所需的最少操作数。 示例 1: 输入:s = "0100" 输出:1 解释:如果将最后一个字符变为 '1',s 就变成 "0101",即符合交替字符串定义 示例 2: 输入:s = "10" 输出:0 解释:s 已经是交替字符串 示例 3: 输入:s = "1111" 输出:2 解释:需要 2 步操作得到 "0101" 或 "101 ...
题目描述LeetCode 1582. 二进制矩阵中的特殊位置 给定一个 m x n 的二进制矩阵 mat,返回矩阵 mat 中特殊位置的数量。 如果位置 (i, j) 满足 mat[i][j] == 1 并且行 i 与列 j 中的所有其他元素都是 0(行和列的下标从 0 开始计数),那么它被称为特殊位置。 示例: 输入:mat = [[1,0,0],[0,0,1],[1,0,0]] 输出:1 解释:位置 (1, 2) 是一个特殊位置,因为 mat[1][2] == 1 且第 1 行和第 2 列的其他所有元素都是 0 解题思路核心观察特殊位置需要同时满足两个条件: 该位置的值为 1 该位置所在的行和列中,只有这一个 1,其他都是 0 优化策略如果直接暴力检查每个位置,需要对每个 1 都遍历整行整列,时间复杂度会达到 O(m² × n²)。 优化思路:预处理每行和每列的 1 的个数 第一次遍历:统计每行和每列的 1 的总数 第二次遍历:检查每个 1 所在的行和列是否都只有一个 1 这样时间复杂度降低到 O(m × n)。 算法步骤 创建两个数组 rows 和 cols,分别记 ...
题目描述LeetCode 1545. 找出第 N 个二进制字符串中的第 K 位 给定两个正整数 n 和 k,二进制字符串 Sn 的形成规则如下: S1 = "0" 当 i > 1 时,Si = S(i-1) + "1" + reverse(invert(S(i-1))) 其中 + 表示拼接,reverse 为反转,invert 为按位翻转 0 和 1 目标:求 Sn 的第 k 位字符。 如果按照规则强行构造完整字符串,当 n 较大时(字符串长度为 2^n - 1),会引发严重的内存溢出和超时。因此,我们需要寻找规律,通过逆向推导将时间复杂度降至 O(n),空间复杂度降至 O(1)。 解题思路解题的关键在于理解字符串生成的对称性。每次生成新的字符串,其实就是把旧字符串放在左边,中间补个 “1”,右边放旧字符串的处理版。 中间位置的值为什么永远是 ‘1’?根据拼接规则 S(i-1) + "1" + ...,新增加的字符 “1” 刚好把左右两部分分隔开,所以它永远位于字符串的正中间。 我们列举前几项来看看: S1 = ...








