逻辑/简单数学
冲鸭
山顶夕景
实践出真知
展开
-
【LeetCode163】缺失的区间(to_string)
文章目录一、题目二、思路三、代码一、题目二、思路因为是有设定边界的,所以首先需要将lower-1 插入到nums的最前方(在vector中可以直接insert), 将 upper+1插入nums末尾(这里用insert或者push_back都可以的) 。然后遍历数组nums:若nums[i+1] - nums [i] = 1时,两个相邻数已经连续了,所以不做处理, i++若nums[i+1] - nums [i] = 2时,加入 nums[i]+1若nums[i+1] - nums [i]原创 2022-03-30 10:35:52 · 698 阅读 · 0 评论 -
【LeetCode剑指offer57 II】和为s的连续正数序列(用vector模拟滑动窗口)
一、题目二、思路因为找的是连续子序列(并且题目的原序列是从小到大元素排列)的和为target,所以使用滑动窗口,如果加上当前元素后sum满足条件则push_back,如果加上当前元素后sum过大了,则需要从该滑动窗口中,减去最前面的元素(最小元素),减着减着可能就找到新一种情况,如果减到sum还比target小了,那没必要继续减了,继续扩大滑动窗口的右侧边界。三、代码class Solution {public: vector<vector<int>> findC原创 2022-03-27 19:55:48 · 935 阅读 · 0 评论 -
【LeetCode剑指offer04】二维数组中的查找(简单数学)
一、题目二、思路从左到右,从上到下,两条路径都是数值从小到大排列,为了确定target是否存在,可以换个起点开始,如从右上角(其实从左下角开始也行),这时候就很神奇了:如果当前值比target大,就不能继续往下走(只会越来越大),而往左边走,值会变小,进一步靠近可能的target;如果当前值比target小,就不能往左边走了(只会越来越小),而往下面走,值会变大,进一步靠近可能的target。另外注意细节,一开始判断matrix二维数组是否为空,如果为空则matrix.size() == 0原创 2022-03-20 10:48:11 · 1032 阅读 · 0 评论 -
【LeetCode168】Excel表列名称(从1开始的进制转换)
一、题目二、思路一般的进制转换题目,只需要对num进行%运算,取得最后一位,然后对num进行/运算(将已经取到的位数去掉),循环直到num为0。一般的进制转换题目都是x在[0, x),即从0开始,满x进一。但是这题是从1开始,所以在进制转换操作前,需要对num进行减1操作,整体偏移,事实上如果漏了减1:class Solution {public: string convertToTitle(int columnNumber) { string ans;原创 2022-02-20 20:46:46 · 693 阅读 · 0 评论 -
【LeetCode470】用 Rand7() 实现 Rand10()(拒绝采样)
一、题目二、思路这题要用到一个奇怪的知识:已知 rand_N() 可以等概率的生成[1, N]范围的随机数那么:(rand_X() - 1) × Y + rand_Y() ==> 可以等概率的生成[1, X * Y]范围的随机数即实现了 rand_XY()要实现rand10(),就需要先实现rand_N(),并且保证N大于10且是10的倍数。这样再通过rand_N() % 10 + 1 就可以得到[1,10]范围的随机数了。而实现rand_N(),我们可以通过上面的奇怪知识对ra原创 2021-10-10 17:36:50 · 710 阅读 · 0 评论 -
【LeetCode238】除自身以外数组的乘积
1.题目2.python代码就是两个for循环,第一for循环先将小于i前半部分的nums[i]相乘,第二个for循环将后半部分nums[i]接着相乘。注意:由于res[0]在表格中的第一个数字是1,而非num[0],所以在列表ans中应该事先放入数字1,即初始化=[1]。resres[0] =1num[1]…num[n-2]num[n-1]res[1] =num[0]1…num[n-2]num[n-1]…………num[n-2]原创 2021-06-11 15:19:33 · 596 阅读 · 1 评论 -
【LeetCode3】无重复字符的最长子串(滑动窗口)
1.题目2.思路滑动窗口,从左到右遍历逐个元素,如果当前元素没有在滑动窗口内(即所需要)则加入;如果当前元素A已经在滑动窗口中存在了,那就要干活剔除左边元素了(滑动窗口中左边第一个A及其左边的所有元素——while循环逐个剔除),注意不是只剔除滑动窗口最左边的元素,如abcb字符串——剔除ab后只剩下cb。另外注意python中的容器set,逐个添加元素是用add,批量添加则是存入一个list中再update进set中。names = []names_set = set(names)##单个原创 2021-05-19 22:33:03 · 697 阅读 · 0 评论 -
【LeetCode48】向右旋转图像90°(先转置,再镜像)
1.题目2.思路要就地实现旋转即不能使用额外的数组空间,那就考虑每次同时操作两个数组元素(交换2个数组元素):(1)先将二维矩阵沿着主对角线翻转;(2)再将矩阵左右翻转即可得到【向右旋转90度的亚子】。即先转置,再镜像。。。好吧我觉得算是一种技巧的积累,在面试突发急想到这方法有点不阔能。3.代码class Solution {public: void rotate(vector<vector<int>>& matrix) { int原创 2021-04-07 19:35:44 · 1910 阅读 · 2 评论 -
【LeetCode剑指62】约瑟夫环(数学or动态规划)
1.题目2.思路可以使用一个环形链表模拟(但是会超时),可以使用灰常巧妙的数学逆推思想:(1)【最后一轮】无论怎样,最后都是只剩下一个元素——可以假设该最后存活的数值为num,且这个元素在数组中的下标一定是0(因为只有1个元素)。(2)【上一轮】是有2个元素,在这轮中num的下标为(0+m)(0+m)(0+m)%nnn=(0+3)(0+3)(0+3)%2=1——说明这一轮删除之前num的下标为1,再次强调!!这个num可理解为若只有2个数(n=2)时,最后存活的元素所在当前轮数组中的下标。(3)原创 2021-02-25 23:49:12 · 942 阅读 · 0 评论 -
【HJ69】矩阵乘法(水题)
1.题目2.思路水题运算。结果矩阵第i行第j列的元素=a矩阵[i][k] × b矩阵[k][j],k从0到m-1遍历,其中m为a矩阵的列数即b矩阵的行数。PS:注意每次进入输出结果中的最内层循环前,answer需要清零(容易漏了)。3.代码#include<iostream>#include<vector>using namespace std;int main(){ int n1,m,n2; while(cin>>n1>>原创 2021-02-23 11:45:46 · 830 阅读 · 0 评论 -
【HJ21】简单密码破解(字符转换)
1.题目2.思路首先,小写字母是要分成2种情况:第一种是a到o,第二种是o到z。其中第一种是每三个为一组,利用这个特性即(a-'a')/3+2+'0'——这里容易忘了加0,因为还是要返回字符类型的;而第二种就直接用if else了(分4种小情况)。接着,大写字母是变成对应的小写字母再后退一个,即a-'A'+'a'+1。最后,数字字符就直接返回即可。3.代码#include<iostream>#include<string>using namespace std;原创 2021-02-19 19:39:45 · 1211 阅读 · 1 评论 -
【HJ5】进制转换(简单数学)
1.题目2.法一:模板进制转换的模板题了,在机试编程总结第十点:#include<string>#include<iostream>using namespace std;int main(){ string str; int ans=0; while(cin>>str){ for(int i=0;i<str.size();i++){ if(str[i]>='A'&&原创 2021-02-19 08:57:31 · 1043 阅读 · 0 评论 -
【2013-2】求最大箱子边长(简单数学,水题)
1.题目题目描述:给出四个正方体箱子的边长,问能装下这四个正方体箱子的大正方体边长最小要多大,要求边长最小且必须能装下四个箱子。输入:2 2 2 12 2 2 2输出:442.思路简单数学。由于大箱子只需要装入4个正方体的箱子(注意大箱子也是正方体),所以正方体的边长至少是前二大的两个正方体箱子的边长之和。注意:sort排序的尾部是数组最后一个元素的后一格,而非指向最后一个元素,所以不要因为最后一个是a[3]即地址为a+3,就以为sort的第二个参数是a+3,实际上为a+4。3.原创 2021-02-18 21:21:41 · 691 阅读 · 0 评论 -
【1078】Hashing&素数
1.题目https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592给出散列表长TSize和欲插入的元素,将这些元素按读入的顺序插入散列表中,其中散列函数为H(key)=key%TSize,解决冲突采用只往正向增加的二次方探查法。如果TSize不是素数,则将TSize重新赋值为第一个比TSize大的素数再进行元素插入。2.思路散列函数H(key)=key%TSize,解决冲突使用二次方探查法。如果步长st原创 2021-01-10 21:49:16 · 652 阅读 · 0 评论 -
【1104】Sum of Number Segments (20分)【简单数学】
1.题目https://pintia.cn/problem-sets/994805342720868352/problems/994805363914686464求出一个正数数列中的连续子列(片段)和的累加。2.思路【法一】可以暴力找数学规律,但是有点花时间,因为最终是要求第i个数的出现次数再最后累加,所以先抽象如为第1、2、3、…、7个数,依次计算第1、2、3、…7个数在长度为1的片段中出现的次数为1 1 1…1,同理计算1、2、3、…7个数在长度为1的片段中出现的次数为1 2 2…2 1,这样原创 2021-01-10 11:39:34 · 697 阅读 · 0 评论 -
【1093】Count PAT‘s (25分)【递推】
1.题目https://pintia.cn/problem-sets/994805342720868352/problems/994805373582557184找出诸如APPAPT中包含多少个PAT(注意不是指“连续”)。2.思路若直接暴力解会超时!!可以先算出T的个数(一层for),然后再一次for从左至右统计P和T的个数,而在这层for循环内的最后,遇到A的时候就可以计算结果:因为遍历字符串的每个A,该A前面的P的个数和该A后面的T的个数的乘积即能构成的PAT的个数,在这个for遍历累加re原创 2021-01-09 23:53:25 · 740 阅读 · 1 评论