leetcode-8 字符串转换整数(atoi)
题目描述字符串转换整数 (atoi)
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0 。
提示:
本题中的空白字符只包括空格字符 ' ' 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
...
leetcode-7 字符串Z字(V字)输出
题目描述Z字变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
123L C I RE T O E S I I GE D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
示例 1:
12输入: s = "LEETCODEISHIRING", numRows = 3输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4输出: “LDREOEIIECIHNTSG”解释:
1234L D RE O E I IE C I H NT S G
说明Z字转化其实就是交替输出字符,如下图所示:
解答
Python
1234567891011121314151617181920212223 ...
leetcode-3 最长子字符串
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串的长度及其开始位置和结束为止。
示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
解答
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108package main/*@Time : 2020/8/26 18:29@Author : austsxk@Email : austsxk@163.com@File : lengthOfLongestSubString.go@Software: GoLand*/import ("fmt")// 位图法 ...
python使用位图对数据进行排序
位图简介
BitMap是很常用的数据结构,可以用来无重复整数的排序等,通常位图需要借助列表进行实现,列表中的每一个数字,都是有一系列二进制的整数的集合。在python中,整数默认为有符合类型,因此,一个整数4个字节,最大能有31位存储数据,1位存储符号位。
位图实现
获取分组索引、修改bit位值(位运算)
array_index = num // 31 + 1
修改的值的bit位置
bit_index = num % 31
代码实现
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465# -*- coding:utf-8 -*-# @Time : 2020-08-26 12:47# @Author : 宋晓奎# @Email : austsxk@vip.qq.com# @File ...
Golang调度器GMP原理与调度全分析
一 Go调度器GPM分析
背景
单进程
早起的操作系统是单核单任务执行,在进行进程调度时,会随着时间推移,CPU会进行调度,在一个时间段内执行一个进程,只有当一个进程执行完成之后,才能继续执行下一个进程。在一个时间段内,有且只有一个任务在被执行。每一个程序或者应用都是串行执行,执行效率低。
于是产生了以下问题:
单核执行,每次只能执行一个单一的流程;
如果被执行的进程任务被阻塞,则会带来CPU的浪费;
于是就有了后续的操作系统的并发操作,当CPU执行某个进程被阻塞时,CPU就会自动切换到其他等待执行的任务,并将挂起的任务的环境与上下文进行保存,这样可以继续执行其他的进程,避免了CPU的浪费与等待。
并行 在多核操作系统中,同一时间、同一时刻多任务同时执行,每一个核都在同时进行任务的调度,每一个核的CPU同一时刻只有一个任务进行调度。
并发 在一个CPU进行多任务调度时,会按照时间片进行轮询调度执行任务,在一个CPU调度的时间轴中,一个时间点下,有且只有 ...
并发常见问题
竞争条件百度定义:
竞争条件指多个线程或者进程在读写一个共享数据时结果依赖于它们执行的相对时间的情形。竞争条件发生在当多个进程或者线程在读写数据时,其最终的的结果依赖于多个进程的指令执行顺序。多个进程并发访问和操作同一数据且执行结果与访问的特定顺序有关,称为竞争条件。
简单来说:当两个或者多个操作必须按照正确的顺序执行,而程序并没有保证这个顺序,这就出现了竞争条件;通常会出现在一个并发操作读,另一个进行并发写入;
代码示例:
1234567891011121314151617package mainimport ( "fmt")func main() { var number int go func() { number++ }() if number == 0 { fmt.Printf("number = %v", number) }}
执行结果可能性就存在三种情况:
情况一: 不输出任何东西,因为 if判断在number赋值之后进行执行;情况二: number = 1,i ...
leetcode-2 两数相加
题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
例如:
123输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807
解答
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758package main/*@Time : 2020/8/26 12:42@Author : austsxk@Email : austsxk@163.com@File : main.go@Software: GoLand*/type ListNode struct ...
Golang中反射reflect的使用
Golang中的反射的使用
反射的含义 反射能够在程序运行过程中探知对象的类型以及对象的值,还可以获取内存结构。弥补了静态语言在动态行为的不足。反射实现了元编程的重要手段。
简单的说反射机制就是在运行时动态的调用对象的方法和属性,golang中使用reflect包可以实现反射。
反射的基础
变量变量包括变量的类型和变量的值
(type, value)
其中类型包括静态类型、内置类型。静态类型就是常见的几种类型 int bool float 等。内置类型就是runtime系统所能识别的类型。
接口变量Golang的指定类型的变量的类型是静态的(也就是指定int、string这些的变量,它的type是static type),在创建变量的时候就已经确定,反射主要与Golang的interface类型相关(它的type是concrete type),只有interface类型才有反射一说。
每一个接口变量都维护一个pair对,其pair对是:(type, value)
value是实际变量值,type是实际变量的类型。一个interface{}类型的变量 ...
树-1-有序数组放入到二叉树中
将一个有序数组的元素放入到二叉树中
题目
将一个有序数组的元素放入到二叉树中,形成的二叉树为二叉搜索树。
实现思路:
1.获取数组的中间元素位置,构建根节点。
2.在将数组开始到中间元素前一个位置构造为节点的左子树。中间元素后一个到数组末尾元素构造为节点的右子树。
3.如果数组的开始位置等于结束位置,则返回。
4.递归调用进行构造。
图示说明
实现代码
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374package mainimport "fmt"// 定义一个节点的结构体type TreeNode struct { // 值域 Value interface{} // 左子节点 ...
栈与队列-3-递归实现栈的逆序
递归实现栈的逆序
题目
将栈只用递归方式实现栈的逆序。
实现思路:
1.先获取到栈底元素,保持原栈的数据信息。
2.将每一步获取到的栈底元素最后押入到栈顶。
图示说明
1. 返回栈底元素,并将其移出掉
2. 递归获取栈底元素,直到栈为空,在将获取到的元素押入到栈中。
实现代码
注意:本代码中的栈结构及其方法,引用上篇定义的栈结构及其方法
12345678910111213141516171819202122232425262728293031323334353637383940package mainimport "fmt"// 每次弹出栈底元素func GetAadRemoveLastElement(m *StackData) interface{} { data, _ := m.Poll() if m.IsEmpty() { return data } ...