跟上一题比多了一个判断过程,使用的是动态规划的方法,注意从后往前比较合适,可以方便打印结果
题目给你一个整数 n 和一个下标从 0 开始的字符串数组 words ,和一个下标从 0 开始的数组 groups ,两个数组长度都是 n 。
两个长度相等字符串的 汉明距离 定义为对应位置字符 不同 的数目。
你需要从下标 [0, 1, ..., n - 1] 中选出一个 最长子序列 ,将这个子序列记作长度为 k 的 [i0, i1, ..., ik - 1] ,它需要满足以下条件:
相邻 下标对应的 groups 值 不同。即,对于所有满足 0 < j + 1 < k 的 j 都有 groups[ij] != groups[ij + 1] 。
对于所有 0 < j + 1 < k 的下标 j ,都满足 words[ij] 和 words[ij + 1] 的长度 相等 ,且两个字符串之间的 汉明距离 为 1 。
请你返回一个字符串数组,它是下标子序列 依次 对应 words 数组中的字符串连接形成的字符串数组。如果有多个答案,返回任意一个。
子序列 指的是从原数组中 ...
一开始就准备遍历做,看题解发现不用这么复杂
题目给你一个整数 n 和一个下标从 0 开始的字符串数组 words ,和一个下标从 0 开始的 二进制 数组 groups ,两个数组长度都是 n 。
你需要从下标 [0, 1, ..., n - 1] 中选出一个 最长子序列 ,将这个子序列记作长度为 k 的 [i0, i1, ..., ik - 1] ,对于所有满足 0 < j + 1 < k 的 j 都有 groups[ij] != groups[ij + 1] 。
请你返回一个字符串数组,它是下标子序列 依次 对应 words 数组中的字符串连接形成的字符串数组。如果有多个答案,返回任意一个。
子序列 指的是从原数组中删掉一些(也可能一个也不删掉)元素,剩余元素不改变相对位置得到的新的数组。
注意:words 中的字符串长度可能 不相等 。
示例 1:
12345678输入:n = 3, words = ["e","a","b"], groups = [0,0,1]输出:["e"," ...
第115场双周赛第一题,一开始考虑用栈,后来发现还不如直接用数组模拟
题目给你一个下标从 0 开始的字符串数组 words ,其中 words[i] 要么是一个字符串形式的正整数,要么是字符串 "prev" 。
我们从数组的开头开始遍历,对于 words 中的每个 "prev" 字符串,找到 words 中的 上一个遍历的整数 ,定义如下:
k 表示到当前位置为止的连续 "prev" 字符串数目(包含当前字符串),令下标从 0 开始的 整数 数组 nums 表示目前为止遍历过的所有整数,同时用 nums_reverse 表示 nums 反转得到的数组,那么当前 "prev" 对应的 上一个遍历的整数 是 nums_reverse 数组中下标为 (k - 1) 的整数。
如果 k 比目前为止遍历过的整数数目 更多 ,那么上一个遍历的整数为 -1 。
请你返回一个整数数组,包含所有上一个遍历的整数。
示例 1:
123456输入:words = ["1","2",&q ...
经典书籍学习
未读第一章作为基础内容的介绍,这里就忽略不讲了
这个博客系列主要是阅读笔记,记录一些重点或者细节,不会事无巨细的记录,毕竟这本书太厚了
基本内置类型
建议:如何选择类型
事实上,大多数程序员能够(也应该)对数据类型的使用做出限定从而简化选择的过程,比如:
当明确知晓数值不可能为负时,选用无符号类型
使用int执行整数运算,如果数值范围超过了int,使用long long
算术表达式中不用char bool
浮点数运算用double
字面值常量
我们可以将整型字面值写作十进制数、八进制数或十六进制形式,用0x或者0X开头来表示十六进制,用0开头来代表八进制数
转义序列
| 含义 | 转义序列 || ——— | ———— || 换行符 | \v || 制表符 | \t || 回车符 | \r |
变量
列表初始化
1234567int units_sold = 0;int units_sold = {0};int units_sold{0};int units_sold(0);
C++11的新特性, ...
实验简介学生可以实现简单的逻辑函数、二进制补码和浮点函数,但必须使用 C 语言的一个高度受限的子集。例如,可能会要求仅用位级运算和直线代码(straightline code)来计算一个数的绝对值。该实验帮助学生理解 C 语言数据类型的位级表示和数据操作的位级行为。
具体实现bitXor(x,y)要求:仅使用 ~ 和 & 完成异或运算。
运算:~ &
即找出同一位都是0或者1的设为0 比较简单
123int bitXor(int x, int y) { return ~(x&y)&~(~x&~y);}
tmin()要求:返回二进制补码表示的最小整数。
运算: ! ~ & ^ | + << >>
做法:补码表示的最小整数为 10…0,即符号位为 1,其余位为 0,直接返回即可
1int tmin(void) { return 1<<31;}
isTmax(x)要求:判断 x 是否为补码表示的最大整数。
运算:! ~ & ^ | +
做法:当 x 为最大整 ...
经典书籍学习
未读预备知识原码、反码和补码的含义为了运算方便,机器数有三种表示法,即原码、反码和补码
原码
原码是一种计算机中对数字的二进制定点表示法,原码表示法在数值前面增加了一位符号位(即最高位为符号位),正数该位为0,负数为1(0有两种表示:+0和-0),其余位表示数值大小。
举个例子,+12的原码就是00001100,-12的原码就是10001100
反码
当数字用原码进行运算时,需要先判断数字正负,这样导致效率不高,如果忽略符号位直接运算,则需要用到反码,但是直接使用反码也会出现问题。
正数的反码和原码一样,负数的反码就是在源码的基础上符号位保持不变,其他位取反
| 十进制 | 原码 | 反码 || ——— | ————- | ————- || 4 | 0000 0100 | 0000 0100 || -2 | 1000 0010 | 1111 1101 |
若进行计算4-2 即4+(-2)
0000 0100(反码)
1111 1101(反码)
0000 0001(反码)
0000 0001 (原码)
发现计算错误,所以为了解决计算不准确问题, ...
周赛第三题跟第一题完全相同,除了数据范围不一样,不能使用暴力法
题目给你一个下标从 0 开始、长度为 n 的整数数组 nums ,以及整数 indexDifference 和整数 valueDifference 。
你的任务是从范围 [0, n - 1] 内找出 2 个满足下述所有条件的下标 i 和 j :
abs(i - j) >= indexDifference 且
abs(nums[i] - nums[j]) >= valueDifference
返回整数数组 answer。如果存在满足题目要求的两个下标,则 answer = [i, j] ;否则,answer = [-1, -1] 。如果存在多组可供选择的下标对,只需要返回其中任意一组即可。
注意:i 和 j 可能 相等 。
示例 1:
123456输入:nums = [5,1,4,1], indexDifference = 2, valueDifference = 4输出:[0,3]解释:在示例中,可以选择 i = 0 和 j = 3 。abs(0 - 3) >= 2 且 abs(nums[0] - n ...
经典书籍学习
未读计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序。虽然系统的具体实现方式随着时间不断变化,但是系统内在的概念却没有改变。所有计算机系统都有相似的硬件和软件组件,它们又执行着相似的功能。一些程序员希望深入了解这些组件是如何工作的以及这些组件是如何影响程序的正确性和性能的,以此来提高自身的技能。本书便是为这些读者而写的。
我们通过跟踪 hello 程序的生命周期来开始对系统的学习——从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止。我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念、专业术语和组成部分。后面的章节将围绕这些内容展开。
1. 信息就是位+上下文hello 程序的生命周期是从一个源程序(或者说源文件)开始的,即程序员通过编辑器创建并保存的文本文件,文件名是 hello.c。源程序实际上就是一个由值 0 和 1 组成的位(又称为比特)序列,8 个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符。
大部分的现代计算机系统都使用 ASCII 标准来表示文本字符,这种方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符。比如,图 ...
答案中恰好有K个1,可以考虑用滑动窗口,如果窗口内的1个数超过k,或者窗口端点为0,则缩小窗口
题目给你一个二进制字符串 s 和一个正整数 k 。
如果 s 的某个子字符串中 1 的个数恰好等于 k ,则称这个子字符串是一个 美丽子字符串 。
令 len 等于 最短 美丽子字符串的长度。
返回长度等于 len 且字典序 最小 的美丽子字符串。如果 s 中不含美丽子字符串,则返回一个 空 字符串。
对于相同长度的两个字符串 a 和 b ,如果在 a 和 b 出现不同的第一个位置上,a 中该位置上的字符严格大于 b 中的对应字符,则认为字符串 a 字典序 大于 字符串 b 。
例如,"abcd" 的字典序大于 "abcc" ,因为两个字符串出现不同的第一个位置对应第四个字符,而 d 大于 c 。
示例 1:
123456789101112输入:s = "100011001", k = 3输出:"11001"解释:示例中共有 7 个美丽子字符串:1. 子字符串 "100011001" 。2 ...
第367场周赛的第一题,暴力直接解决
题目给你一个下标从 0 开始、长度为 n 的整数数组 nums ,以及整数 indexDifference 和整数 valueDifference 。
你的任务是从范围 [0, n - 1] 内找出 2 个满足下述所有条件的下标 i 和 j :
abs(i - j) >= indexDifference 且
abs(nums[i] - nums[j]) >= valueDifference
返回整数数组 answer。如果存在满足题目要求的两个下标,则 answer = [i, j] ;否则,answer = [-1, -1] 。如果存在多组可供选择的下标对,只需要返回其中任意一组即可。
注意:i 和 j 可能 相等 。
示例 1:
123456输入:nums = [5,1,4,1], indexDifference = 2, valueDifference = 4输出:[0,3]解释:在示例中,可以选择 i = 0 和 j = 3 。abs(0 - 3) >= 2 且 abs(nums[0] - nums[3]) >= ...