s1

最小栈

十年热恋 提交于 2020-02-21 23:52:39
题目链接: 涉及知识: 栈 题目要求: 通过已学的数据结构实现一个最小栈,可以实现 push、pop、top 和 getMin ,分别表示入栈、出栈、返回栈顶元素和返回当前栈中元素的最小值。并且要求 getMin 方法的时间复杂度为常数时间。 实现思路: 使用两个栈来实现。 数据栈:按入栈的顺序保存元素。 辅助栈:只保存比当前栈顶元素小的元素。(初始状态栈为空保存第一个元素) 在出栈时,当数据栈直接出栈,辅助栈当且仅当弹出的数据栈的元素的值等于栈顶元素的值的时候才出栈。 为什么辅助栈入栈的时候要小于等于? 小于等于是因为可能连续入栈的多个元素相等,且是最小的,如果辅助栈中只保存一份,那么当数据栈出栈的时候,弹出若干个相等元素中的一个时,便将辅助栈中保存的值弹出,出错。 代码实现: import java.util.Stack; /* * @lc app=leetcode.cn id=155 lang=java * * [155] 最小栈 */ class MinStack { Stack<Integer> s1 = null; Stack<Integer> s2 = null; /** * initialize your data structure here. * 使用两个栈保存数据,s1 按插入顺序保存,s2 永远保存比栈顶小的元素 * */ public MinStack()

zzulioj 1163: 亲和串(字符串)

懵懂的女人 提交于 2020-02-08 00:00:48
1163: 亲和串(字符串) 题目描述 判断亲和串。亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。 输入 本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。 输出 如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。 样例输入 Copy AABCD CDAA ASD ASDF ab aba 样例输出 Copy yes no no 笨人的笨方法 # include <stdio.h> # include <string.h> int f ( char a [ ] , char b [ ] , int l1 , int l2 ) { int i , j , k = 0 ; for ( i = 0 ; i < l1 ; i ++ ) { if ( a [ i ] == b [ 0 ] ) for ( j = 1 ; j < l2 ; j ++ ) { k = ( i + j ) % l1 ; if ( a [ k ] == b [ j ] ) continue ; else break ; } if ( j == l2 ) return 1 ; } return 0 ; } int main ( ) {

POJ 3087 Shuffle'm Up

喜夏-厌秋 提交于 2020-02-07 09:42:59
POJ 3087 Shuffle’m Up(简单模拟题) 题目大意: 给出两个长度为len的字符串s1, s2和一个长度为2 * len的字符串s12,每次先让s2先s1后先后依次取一个字符得到一个长度为2 * len 的字符串s,如果发现得到的字符串s与s12相等就输出交换的次数,否则让s的左半边等于s1右半边等于s2再进行上面的变换,如果无法使的变换后的s == s12则输出-1。 具体思路: 直接模拟,注意判断为-1的条件是,经过若干次洗牌后,s1和s2变成了原来的s1,s2 具体代码: # include <iostream> # include <string> # include <cstdio> # include <stdlib.h> using namespace std ; int main ( ) { int n ; string ss1 , ss2 ; cin >> n ; for ( int i = 0 ; i < n ; i ++ ) { int c ; string s1 , s2 , s12 ; cin >> c >> s1 >> s2 >> s12 ; ss1 = s1 ; ss2 = s2 ; int cnt = 0 ; int flag = 1 ; string newStr ; do { cnt ++ ; newStr = "" ; for

扩展KMP算法的详细理解+例题--hdu 2328

妖精的绣舞 提交于 2020-02-03 04:51:50
借鉴博客: https://blog.csdn.net/qq_40160605/article/details/80407554 扩展KMP的详细理解 扩展KMP求的是对于原串S1的每一个后缀子串与模式串S2的最长公共前缀。它有一个next[]数组和一个extend[]数组。 next[i]表示为模式串S2中以i为起点的后缀字符串和模式串S2的最长公共前缀长度. 其中,next[0]=l2; next[i]=max{ k|i<=i+k-1<l2 &&S2.substring(i,i+k-1) == S2.substring(0,k-1) } 其中str.substring(i, j)表示str从位置i到位置j的子串,如果i>j则,substring为空。 extend[i]表示为以字符串S1中以i为起点的后缀字符串和模式串S2的最长公共前缀长度. 下面我们先以一组样例来理解扩展KMP的过程 (1) 第一步,我们先对原串S1和模式串S2进行逐一匹配,直到发生不配对的情况。我们可以看到,S1[0]=S2[0],S1[1]=S2[1],S1[2]=S2[2],S1[3] ≠S2[3],此时匹配失败,第一步结束,我们得到S1[0,2]=S2[0,2],即extend[0]=3; (2) Extend[0]的计算如第一步所示,那么extend[1]的计算是否也要从原串S1的1位置

ES6笔记(4)-- Symbol类型

泄露秘密 提交于 2020-02-03 03:35:48
  系列文章 -- ES6笔记系列 Symbol是什么?中文意思是标志、记号,顾名思义,它可以用了做记号。 是的,它是一种标记的方法,被ES6引入作为一种新的数据类型,表示独一无二的值。 由此,JS的数据类型多了一位成员: Number、String、Boolean、undefined、Object、Symbol 一、简单使用 1. 声明 类似字符串String的声明方式 var str = 'str'; Symbol的声明方式类似,它调用构造函数Symbol() var s = Symbol(); typeof s // symbol 2. 使用 Symbol声明了是为了使用 var s = Symbol(); var s1 = Symbol(); console.log(s, s1);console.log(s == s1); // false Chrome的输出中自动对Symbol类型的数据做了标识处理,由输出知道,虽然通过Symbol生成的两个标志不相同,但两个变量混淆了分不清。 实际上,为了区别出不同的symbol,我们可以在参数中指定 var s = Symbol('s'); var s1 = Symbol('s1'); console.log(s, s1); symbol除了简单的在控制台输出之外,还可以参与到其他代码逻辑运算中去,最常见的是在对象属性名称中

python记录_day07

人走茶凉 提交于 2020-02-02 03:25:58
一、基本数据类型补充 1、列表的拼接用join()方法 1 li = ["hello","world"] 2 s = "_".join(li) 3 print(s) # hello_world 这个方法刚好和split()相反,可以对比着记。 2、关于删除: 列表和字典在循环的时候都不能删除。 通常的做法是:把想删除的内容保存在新列表中,循环新列表,删除旧列表或字典。 lst = ["王大锤", "王有才", "张小白", "刘大哥"] #把要删除的内容记录在一个新列表中 new_lst = [] for el in lst: new_lst.append(el) # 循环这个新列表. 删除原来的列表 for el in new_lst: # 不会导致循环的列表的元素移动问题 lst.remove(el) # 注意, 删除的是老列表 3、fromkeys() 用法 dict.fromkeys(iter, value) 把可迭代对象进行迭代。 和后面的value组合成键值对 返回新字典 dic = dict.fromkeys("周杰伦",["麻花藤"]) print(dic) #{'周': ['麻花藤'], '杰': ['麻花藤'], '伦': ['麻花藤']} dic["周"].append("jay") print(dic) #{'周': ['麻花藤', 'jay'], '杰':

Python 集合常用方法

不羁岁月 提交于 2020-02-01 12:07:16
数据类型:int/str/bool/list/dict/tuple/float/set ( set类型天生去重 ) 一、集合的定义 s = set() #定义空集合 s = {'a','b','c','d'} #集合不是key-value 形的,无冒号 集合是无序的,没办法通过下标取值 二、集合赋值 s.add() s = {'a','b','c','d'}s.add('ijk') #注意add 与 update 的区别# s.update('fgh')print(s) 输出结果: {'d', 'ijk', 'c', 'b', 'a'} s.update() 输出结果: {'f', 'b', 'g', 'd', 'a', 'c', 'h'} s = set() s = set('cheeseshop')print(s) 输出结果: {'s', 'e', 'p', 'h', 'o', 'c'} 三、删除集合元素 s.remove()s = set('cheeseshop')s.remove('er') # 删除不存在的会报错s.remove('e')print(s) s.pop() #随机删除一个 s.discard('er') #如果删除的元素存在,删除,不存在不做处理 del s # 删除集合 四、集合常用操作 s -= set('copy') 等价于 s = s - set(

python集合的定义

雨燕双飞 提交于 2020-02-01 04:10:15
1. 集合的定义 集合里面的元素是不可重复的 s = { 1 , 2 , 3 , 1 , 2 , 3 , 4 , 5 } print ( s ) print ( type ( s ) ) 1 2 3 如何定义一个空集合 # s2 = { } # print ( type ( s2 ) ) s3 = set ( [ ] ) print ( s3 ) print ( type ( s3 ) ) 1 2 3 4 5 6 可以看到,集合有去重的作用 集合应用 li = [ 1 , 2 , 3 , 1 , 2 , 3 ] print ( list ( set ( li ) ) ) 1 2 3 2. 集合的特性 集合只支持成员操作符号和for循环 s = { 1 , 2 , 3 } # print ( s [ 0 ] ) # print ( s * 3 ) # print ( s + { 4 , 5 , 6 } ) 1 2 3 4 可以看到,集合不支持索引 可以看到,集合不支持重复 可以看到,集合不支持连接 2.1 成员操作符 print ( 1 in s ) 1 2.2 for循环 for i in s : print ( i ) 1 2 3. 集合的常用方法 s = { 6 , 7 , 8 , 9 } #定义一个集合 1 3.1 增加一个元素 集合是一个无序的数据类型

python17之day2

落爺英雄遲暮 提交于 2020-02-01 01:52:02
一、进制 1.进制简介   进制就是进位制,是一种进位方法。计算机语言就是二进制,计算机能直接识别二进制数据,其它数据都不能直接识别。 2.常用进制  1) 十进制:运算规则”逢十进一”; 2) 八进制:运算规则”逢八进一”; 3) 十六进制:运算规则”逢十六进一”; 4) 二进制:运算规则”逢二进一”。 3.进制转换 我们有最常用的转换方法:用十进制数据除以目标进制得到余数,并将余数从最后一个到第一个排列,就是转换后的目标进制表示形式(简称“ 除基取余,直到商为0,余数反转 ”)。以十进制43向二进制转换为例,得到的数值排列:101011,所以十进制43的二进制表示形式为101011,同理,如果求八进制、十六进制表示形式,用43除以8、16即可。 二、基本数据类型 1.字符串 类:str 方法:选中str,按住command(ctrl)+左键跳转至对应的方法 字符串常用方法归纳如下: 1)capitalize 功能:实现字符串首字母大写,自身不变,会生成一个新的值 2)casefold 功能:将所有大写变成小写,另外支持多门语言变化 3)lower,upper 功能: lower:将所有的大写变小写,局限英文 upper:将所有小写变大写 4)center 功能:文本居中,空白处填充字符 参数1:表示总长度;参数2:空白处填充的字符(长度为1) 例子: 1 name = 'tx'

py第二天

ぐ巨炮叔叔 提交于 2020-02-01 01:51:23
第1章 基本数据类型 1.1 字符串类-str 1. captialize首字母大写 name = 'alex' v=name.capitalize() print(v) 2. casefold 所有字母大写变小写,支持各种语言 name = 'Alex' v=name.casefold() print(v) 3. lower 所有字母大写变小写 name = 'Alex' v=name.lower() print(v) 3. center 文本居中 参数1:20表示总长度 name = 'Alex' v=name.center(20) print(v) 参数2:填充的字符Y name = 'Alex' v=name.center(20,'Y') print(v) 4. count 传入值在字符串中出现的次数 参数1:要查找的值(子序列) name = 'Alexaaaaafsssswwww' v=name.count('a') print(v) 参数2:起始位置(索引) name = 'Alexaaaaafsssswwww' v=name.count('a',6) print(v) 参数3:结束位置(索引) name = 'Alexaaaaafsssswwww' v=name.count('a',6,8) print(v) 5. endwith 是否以...结尾