剑指 Offer 56 - II. 数组中数字出现的次数 II(二进制求和模运算)
一、题目剑指 Offer 56 - II. 数组中数字出现的次数 II(位运算的妙用)
题目描述
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
示例1:
12输入:nums = [3,4,3,3]输出:4
示例2:
12输入:nums = [9,1,7,9,7,9,7]输出:1
二、分析方法1:hashMap统计个数,遍历返回比较常规的思路就是通过hashMap统计个数,然后遍历返回即可。思路简单,但这种方法显示没有充分利用题中的条件其他数字都出现了三次。所以一定不是最优解。
方法2:位运算分析其他数字出现了三次,这是我们解题的突破点。
做这种数字题,我们要有位运算的思想在,所以我们绞尽脑汁往位运算那边去靠。我们试想一下,如果将所有数字转换为二进制,然后观察一下会有什么规律呢?如下:
12345678910nums=[4,4,4,5,5,5,3]出现3次:4,5* 4:0100b* 4:0100b* 4:0100b* 5:0101b* ...
磁道扇区柱面是啥
磁道、扇区、盘片首先,先在大脑中建立硬盘中专业术语到实物的映射。
在脑海中建立硬盘的大致结构。简单来说硬盘就像一个一个盘子堆叠起来的结构。如下图。
在硬盘中,我们将类似每一个盘子的东西称作盘片。在这个盘片上会划分很多个同心圆,就像操场跑道一样的同心圆。如下图。
我们这一条条跑道称为磁道。将每一条跑道划分为一个一个的扇形的小块,将小块称为扇区。如下图:
好了,有了这些基本的结构和术语类比,相信这些术语你能凭借字面意思就能想象他们的样子了。那下面内容对你轻而易举~
柱面、磁头柱面就是每个磁道叠起来形成的一个柱面。如下图:
重要结论
柱面数 = 一个盘面的磁道数
磁头数 = 盘面数
一个盘面容量 = 512(一个扇区容量) x 一个磁道的扇区数 x 一个盘面的磁道数
磁盘容量=512 x 一个磁道扇区数 x 一个盘面的磁道数x磁头数
参考图解磁盘
汉诺塔的非递归实现(借助堆栈模拟递归)
汉诺塔的非递归实现借助堆栈以非递归(循环)方式求解汉诺塔的问题(n,a,b,c)。即将n个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标杜(标记为“c”),并保证每个移动符合汉诺塔问题的要求。
思路分析汉诺塔问题求解的基本思路是,不断将n个盘的汉诺塔问题转换为2个n-1盘的汉诺塔问题,因此用递归实现是很自然的方法。当把n盘问题转换为n-1 盘问题时,问题的起始柱子和目标柱子也发生了变化。设n盘问题为(n,a,b,c),其中参数如实验内容中所定义,则问题的求解可转换为对(n-1,a,c,b)、(1,a,b,c)、(n-1,b,a,c)这三个问题的求解,其中(1,a.b,c)不需要递归,可直接实现。
在要求不用递归的情况下,可以借助自己建立的堆栈来解决问题。将待求解问题放入堆栈,然后不断将栈顶的问题分解,再将分解出的n>1 的新问题放入堆栈,如此不断循环一直到堆栈为空,问题求解就可结束。
注意:当将分解出的上述三个问题压入堆栈时,应该按照“需要先求解的问题后压入”的顺序,也就是压入顺序为(n-1,b,a,c).(1,a,b,c)(n-1,a,c,b)。
伪代码 ...
指针重点总结
C/C++指针踩坑历险记-常量指针-const ptr *,指针常量ptr * const,引用,指针传参,指针修改,指针指向的值修改等问题好久没写C语言了,不过一直用C++在刷题,遇到指针总有些发憷?初学指针的时候觉得指针好难,其实搞清指针的重要几个概念,指针就不难~对指针一些重点知识进行一个总结。
指针初体验我们知道指针本质上就是一个存放地址的变量(该变量存放地址,一串你看不懂的数字)。比如
12int a = 3;int* ptr = &a;//就表示指向a的一个变量ptr,ptr内部存放的是一个地址(一串你看不懂的数字)
下面举个例子,直观地展示一下ptr的值
12345678#include<stdio.h>#include<stdlib.h>int main(){ int a = 3; int* ptr = &a;//ptr是一个地址 printf("0x%x", ptr);//打印ptr的值}
输出结果
通过设置断点查看程序执行过程,也可以查看ptr存放的到底是什么
你 ...
剑指 Offer 56 - I. 数组中数字出现的次数(位运算)-真是妙蛙种子吃着妙脆角秒进米奇妙妙屋秒到家了
一、题目剑指 Offer 56 - I. 数组中数字出现的次数(位运算的妙用)
题目描述
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例1:
12输入: [4,1,4,6]输出: [1,6]或者[6,1]
示例2:
12输入: [1,2,10,4,1,4,3,3]输出: [2,10] 或 [10,2]
二、分析1.方法1:排序后,暴力遍历这种方法思路简单,但是时间复杂度较高。排序消耗O(nlogn),遍历消耗O(n),思路简单,但是不是最优解。
2.方法2:位运算分析
我们知道异或运算有个特点,0和任何数异或是任何数本身,先记住这个结论。我们先将此题简化为一个整型数组中只有一个数字$x$只出现了一次,其他数字$a_i$ 都出现了两次。数组定义如下$nums=[ a_i, a_i ,x]$对于这个简化了的题,我们如果想到用位运算异或的性质,就很好求解了,直接将数组中所有的数值做异或运算,结果就是出现了一次的数$x$。公式如下:
$$x=a_i\ ...
剑指 Offer 62. 圆圈中最后剩下的数字思路推导(约瑟夫环、DP、递归)
一、题目
剑指 Offer 45. 把数组排成最小的数题目描述输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例1:
12输入: [10,2]输出: "102"
示例2:
12输入: [3,30,34,5,9]输出: "3033459"
二、分析1.方法1:暴力组合法我们可能下意识会想到用DFS求组合的方法,将所有情况暴力枚举出来。然后再比较得到最小的组合方法。
时间复杂度:组合O(n!)+ 比较O(n)
空间复杂度:O(n)
时间复杂度太高,此方法是下策,所以我们暂时不考虑用此种方法。
2.方法2:排序法此题难点就是考虑将其转换成排序问题。题目要求的是数组组合成最小的数,问题就是如何将数组组合才能使其最小。
我们定义了一种排序规则:
12x,y是数组两个数。如果组合xy<yx,那么x<yx,y是数组两个数。如果组合yx<xy,那么y<x
定义了该规则后,将整个数组从小到大排序就能得到数组最小数组合了。
三、代码1.自己写快排(自己造轮子)1234567 ...
剑指 Offer 62. 圆圈中最后剩下的数字思路推导(约瑟夫环、DP、递归)
一、题目剑指 Offer 41 数据流中的中位数题目详细描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
例如,
123[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5
二、分析详细分析
传统方法求一个数据流的中位数,咋一看很简单。我们下意识的会想到直接用排序的方法,在每次查找中位数的时候,进行排序(快排,堆排,冒泡等皆可),利用中位数下标定位并返回中位数结果。但是这种方法对于频繁的求中位数,需频繁进行排序,时间复杂度太高,会超出时间限制。
堆堆求中位数方法数据结构准备
因为要求中位数,我们将数据分为两份,分别放在两个堆中。(利用堆顶具有该数据中最大或者最小值,也就是将整个数据流的分界线找到)
大数据堆:较大的数据,放在小顶堆(保证堆顶是大数据中最小值)
小数据堆:较小的数据,放在大顶堆(保证堆顶是小数据中最大值)
注意大数据堆和大顶堆的区别,大数据堆指的是存放两部分中较大的 ...
初识context
前言相信在学编程过程中许多小伙伴遇到过多次context这个单词吧,可它到底是是什么意思却有点犯迷糊。今天就来总结一下。加深一下对context的理解。
contextcontext,中文翻译上下文。所谓上下文就是一段程序运行成功所需要的外部环境的集合。因此,上下文也可以叫做环境。环境中主要指的是外部的变量。举个栗子,在程序运行过程中,需要外部的变量。那么必须将外部变量一个一个输入进去,程序才能正确执行。上下文切换所谓上下文切换就是环境的切换。什么的环境呢?程序的环境切换。比如一个程序切换到另一个程序,系统会进行环境的保存(比如将一些变量压入栈内),然后加载新程序的环境(比如将栈内的变量弹出,最后会放到context这个集合中)。
参考 https://wenku.baidu.com/view/df311707ac45b307e87101f69e3143323968f5d1.html
什么是随机变量
1.随机变量定义先搬科学定义定义 设随机变量试验的样本空间为$S$ 。$X=X(e)$是定义在样本空间的实值单值函数。称$X=X(e)$为随机变量。
解释
样本空间:就是试验中可能的取值。举个栗子,预测明天的天气情况如下:
天气
下雨
多云
晴天
概率
0.3
0.5
0.2
对于该表,样本空间$S$就是{下雨、多云、晴天}集合。
$X=X(e)$为实值单值函数:啥叫实值单值函数?可以理解为一个值为实数的函数。
对于上面表格,e为天气的某一个取值,也就是说$e \in S$,$S$为前面提到的样本空间。$X=X(e)$表示对样本空间一个取值进行一个映射。比如我可以将下雨->(映射到)1,多云->2,晴天->3。
所以,何为随机变量,随机变量就是对样本空间值的一个映射。本质上就是一个函数。别人问你随机变量是什么的时候,你就可以跟他说是一个函数。听起来是不是很牛逼哈哈哈。
为什么需要定义随机变量呢?是因为下雨多云晴天这种文字在数学中根本无法运算,为了在数学中能够参与运算,就将样本空间映射到实数范围内。还是为了 ...
Matplotlib快速入门
一、定义
主要用于开发2D图表
数据分析,基于分析,进行展示
二、绘图流程
创建画布
绘制图像
显示图像
三、折线图与基础绘图功能1.图形保存 plt.savefig()
注意:图像保存一定要放到show前面
2.添加X轴,y轴刻度 plt.xticks
plt.yticks
注意:第一个参数必须是数字,如果不是数字,需要进行值替换
123456789import matplotlib.pyplot as pltplt.figure()plt.plot([1,2,3],[1,2,3])x_ticks=range(6)x_ticks_name=["{}min".format(i) for i in x_ticks]y_ticks=range(6)plt.xticks(x_ticks[::2],x_ticks_name[::2])# 如果要设置字符串必须要第一个参数为行向量数字plt.yticks(y_ticks[::2])plt.show()
3.添加网格plt.grid()
参数:linestyle–绘制网格方式
...