我们通过 barcode_scan 这个库来实现二维码、條形码的扫描
本文参与,欢迎正在阅读的你也加入一起分享。
此解法可以处理元素相同的情况比如 [3,33,1]
// 面试题18(┅):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针定义一个函数在O(1)时间删除该
// 题目 21:调整数组顺序使奇数位于偶数前面 // 题目:输入一个整數数组,实现一个函数来调整该数组中数字的顺序使得所有 // 奇数位于数组的前半部分,所有偶数位于数组的后半部分
先求出相遇点,然后根据数学公式
从相遇点出发和从head出发相遇点就是 环入口点
简单看看螺旋矩阵其规律就是一圈一圈的往里绕,因此我们可以想象有一条贪吃蛇它很听话,如果要出格子或者碰到格子里有数的时候就向右轉一下然后在它路过的格子里顺序填充上数字就好
从 1 至 10在它们的个位数中,数字1出现了 1 次
从 1 至 100,在它们的十位数中数字1出现了 10 次。
从 1 至 1000在它们的百位数中,数字1出現了 100 次
依此类推,从 1 至 10i在它们右数第二位中,数字1出现了10 ^ (i - 1)次
对于 n = 2134,要找到从1 ~ 2134这2134个数字中所有1的个数。我们可以对2134进行逐位分析:
(1)在个位上从1~2130,包含213个10因此数字1出现了213次,剩下的数字2131、2132、2133、2134中个位数上只有2131包含树脂字1剩下的都不包含。所以个位数上的数字1的总数为213 + 1 = 214
(4)在千位上,包含了0个10000因此数字1出现了0 * 1000 = 0次,剩下的数字中只有1000 ~ 1999这1000个数字中的千位的数字为1所以千位上的数字1的总数为1000。
总结一下以上嘚步骤可以得到这么一个规律:
对于数字n,计算它的第i(i从1开始从右边开始计数)位数上包含的数字1的个数:
假设第i位上的数字为x的话,則
1.如果x > 1的话则第i位数上包含的1的数目为:(高位数字 + 1)* 10 ^ (i-1) (其中高位数字是从i+1位一直到最高位数构成的数字)
3.如果x == 1的话,则第i位数上包含1的数目為:(高位数字) * 10 ^ (i-1) +(低位数字+1) (其中低位数字时从第i - 1位数一直到第1位数构成的数字)
以第1001位数字7为例
步骤1:首先确定该数字是属于几位数的;
步骤2:确定该数字属于哪个数。100+(= 370
步骤3:确定是該数中哪一位。0-100)*3 = 1,所以位于“370”的下标为1的位置即数字1。
子问题: 求一个字符的字符串,求二个字符
边界值: 一个字符的个数是1
狀态:i的状态为 以第i个字符为结尾的最长子串
1 如果当前字符没有在之前扫描过的字符串中出现过当前的就为 上次的f(i-1)+1
2 如果当前的字符 在上┅次出现过
2.2 2个相同字符的距离 没有超过上一个状态的时候,f(i)=2者的距离
┅个整数数组里除了两个数字出现一次,其他数字都出现两次请找出这两个数字。要求时间复杂度为o(n)空间复杂度为o(1)。
这道题可以看成“数组中只出现一次的一个数字”的延伸如果所有数字都出现两次,只有一个数字是出现1次那么可以通过把所有所有进行异或运算解決。因为x^x = 0
但如果有两个数字出现一次,能否转化成上述问题依旧把所有数字异或,最终的结果就是那两个出现一次的数字a,b异或的结果因为a,b不想等因此结果肯定不为0,那么结果的二进制表示至少有一位为1找到那个1的位置p,然后我们就可以根据第p位是否为1将所有的數字分成两堆这样我们就把所有数字分成两部分,且每部分都是只包含一个只出现一次的数字、其他数字出现两次从而将问题转化为朂开始我们讨论的“数组中只出现一次的一个数字”问题。
滑动窗口可以看作是队列,为了得到滑动窗口的最大值队列可以从两端删除元素,因此使用双向队列
原则:对于新来的元素k,将其与队列中元素比较
1、若队列中有元素比k小,直接将之前比k小的元素移除队列(因为不可能再成为后面滑动窗口的最大值)压入k
2、若隊列中元素x比k大,则根据下标检测x是否在窗口内如果不在则移除队列,压入k
队列的第一个元素是滑动窗口的最大值同时要存储数字在數组的下标,而不是数值用来判断滑动窗口是否包含数字
2、3比2大,弹出2压入3
3、4比3大,弹出3压入4
4、2比4小,4还在窗口内保留4,压入2
5、6仳4和2都大因此弹出4和2,压入6
6、2比6小6在窗口内,保留6压入2
7、5比2大,比6小且6还在窗口内,弹出2压入5
8、1比6和5都小,但是6不在窗口内6彈出,压入1
Universal Boot Loader是遵循 GPL 条款的开放源码项目。從 FADSROM、 8xxROM、PPCBOOT 逐步发展演化而来其源码目录、编译形式与 Linux 内核很相似,事 实上不少U-Boot源码就是相应的 Linux内核源程序的简化,尤其是一些设备的驱動程序 这从U-Boot源码的注释中能体现这一点。 在参考相关文档和搜 索 U-Boot-User 邮 件 档 案 库 )的 UPM表设置上电初始化。 ③ FLASH的驱动程序 如board/RPXlite/)ERASE 0x BLOCK [REGS] DMM1 0xFA200000 FILE )的一种实现方法。其本身所起的作用就是实现一些目标板所需的脉冲信号和电路逻辑其功 能完全可以用一些逻辑电路与 CPU口线来实现。 ⑧ SDRAM的驱动串口能輸出以后,U-Boot移植是否顺利基本取决于 SDRAM的驱动是 否正确与串口调试相比,这部分工作更为核心难度更大。 MPC8xx 目标板 SDRAM 驱 动涉及三部分一是楿关寄存器的设置;二是 UPM表;三是 SDRAM上电初始化过程。任 何一部分有问题都会影响 U- Boot、嵌入式操作系统甚至应用程序的稳定、可靠运行。所 鉯说SDRAM 的驱动不仅关系到 U-Boot 本身能否正常运行,而且还与后续部分相关是 相当关键的部分。 ⑨ 补充功能的添加在获得一个能工作的 U-Boot后,僦可以根据目标板和实际开发需要 添加一些其它功能支持。如以太网、LCD、NVRAM 等与串口和 SDRAM 调试相比,在 已有基础之上这些功能添加还是較为容易的。大多只是在参考现有源码的基础上进行一 些修改和配置。 另外如果在自主设计的主板上移植 U-Boot,那么除了考虑上述软件因素以外还需要排 查目标板硬件可能存在的问题。如原理设计、PCB 布线、元件好坏在移植过程中,敏锐 判断出故障态是硬件还是软件问题往往是关系到项目进度甚至移植成败的关键,相应难度 会增加许多 下面以移植 u-boot 到 44B0开发板的步骤为例,移植中上仅需要修改和硬件相关嘚部分在 代码结构上: 1) 在 中有一些环境变量,例如 ip 地址引导文件名等,可在命 令行通过 setenv 配置好,通过 saveenv 保存在 (共 64k)这段空间里如果存茬 保存好的环境变量,u-boot 引导将直接使用这些环境变量正如从代码分析中可以看到, 我们会把 flash 引导代码搬移到 DRAM 中运行下图给出 u-boot 的代码在 DRAM Φ的位 置。引导代码 .word irq _fiq: .word fiq S3C2410的 CPU规定开机后的 PC寄存器地址为 0即从 0 地址开始执行指令,因此我们必须把我们的 复位代码放在 0 地址处才能正常开机 ARM核也规定启动地址处的 32个字节必须存放异常向量跳转表,里面保存有中断异常等的处理函数 地址。当系统产生中断时必定会跳到这里來开始处理中断。具体可参考 ARM方面的书籍 由 2、u-boot的流程、主要的数据结构、内存分配。 3、u-boot的重要细节主要分析流程中各函数的功能。 4、基于 FS2410板子的u-boot移植实现了 NOR Flash和 NAND Flash启动,网络功能。 这些认识源于自己移植 u-boot过程中查找的资料和对源码的简单阅读下面主要以 smdk2410为分析对 象。 一、u-boot笁程的总体结构: 1、源代码组织 对于 ARM而言主要的目录如下: board 平台依赖 存放电路板相关的目录文件,每一套板子对 应一个目 录。如 smdk2410(arm920t) cpu 平台依赖 存放 CPU 相关的目录文件每一款 CPU 对应一个目 录,例如:arm920t、 xscale、i386 等目录 lib_arm 平台依赖 存放对 ARM 体系结构通用的文件主要用于实现 ARM平台通用的函数,如軟件浮点 common 通用 通用的多功能函数实现,如环境命令,控制台相关的函数实 现 include 通用 头文件和开发板配置文件,所有开发板的配置文件嘟在 configs目录下 lib_generic 通用 通用库函数的实现 net 通用 存放网络协议的程序 drivers 通用 通用的设备驱动程序主要有以太网接口的驱动,nand 驱 动