分割字符串
我们经常遇到要分割字符串例如
20-21,15,18,30,5-10
以,
来分割
首先引入头文件
1 | #include <sstream> |
然后定义一个stringstream对象,用来输入输出,这个对象既可以把数字变成字符串,也可以把字符串变成数字,甚至可以分割被空格、制表符等符号分割的字符串(简单来说就是去空格和换行)
我们以下面这道题来了解下股票问题这个框架。
具体可参考labuladong
每天都有三种「选择」:买入,卖出,无操作,我们用
buy
,sell
,rest
表示三种选择。
但问题是,并不是每天都可以任意选择这三种选择,因为sell
必须在buy
之后,buy
又必须在sell
之后。那么rest
操作之后还应该分两种状态:一种是buy
之后的rest
(持有了股票),一种是sell
之后的rest
(没有持有股票)。而且别忘了,我们还有交易次数k
的限制,就是说你buy
还只能在k > 0
的前提下操作。
这个问题的「状态」有三个,第一个是天数,第二个是允许交易的最大次数,第三个是当前的持有状态(即之前说的rest
的状态,我们不妨用
1 表示持有,0
表示没有持有)。然后我们用一个三维数组就可以装下这几种状态的全部组合:
分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。
注:真分数指分子小于分母的分数,分子和分母有可能gcd不为1!
如有多个解,请输出任意一个。
输入:
8/11
2/4输出:
1/2+1/5+1/55+1/110
1/3+1/6说明:
第二个样例直接输出1/2也是可以的
单调栈的用途不太广泛,只处理一种典型的问题,叫做 Next Greater Element。
给你一个数组nums
,请你返回一个等长的结果数组,结果数组中对应索引存储着下一个更大元素,如果没有更大元素,就存
-1。
例如:输入一个数组
nums = [2,1,2,4,3]
,你返回数组[4,2,4,-1,-1]
ps: 第⼀个 2 后⾯⽐ 2 ⼤的数是 4; 1 后⾯⽐ 1 ⼤的数是 2;第⼆个 2 后⾯⽐ 2 ⼤的数是 4; 4 后⾯没有⽐ 4⼤的数,填 -1;3 后⾯没有⽐ 3 ⼤的数,填 -1。
当然我们很轻松就可以想到暴力解法,就是对每个元素后面都进行遍历,找到第一个更大的元素就可以了,但是暴力解法的时间复杂度是O(n^2)
这个问题可以这样抽象思考:把数组的元素想象成并列站⽴的⼈,元素⼤⼩想象成⼈的身⾼。这些⼈⾯对你站成一列,如何求元素「2」的Next Greater Number呢?
很简单我们只需要把它能看到的一个元素就是答案,因为矮的都被挡着看不到。
我们从后面开始看,3 前面没人,所有输入 -1,4前面没有比它大的,并且3 比它小,所以把 3 出栈,并输入 -1 ,2 前面有 4 比它大,所以输入4,并且2入栈,1 前面第一个看到的是 2, 所以输入 2, 并且进栈,2 前面看到的是 4 ,输入4 并且前面的1 和 2 都出栈。
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。