1028.负二进制转换
题目描述
给出数字 N
,返回由若干 "0"
和 "1"
组成的字符串,该字符串为 N 的负二进制(base -2
)表示。
除非字符串就是 "0"
,否则返回的字符串中不能含有前导零。
示例1:
输入:2
输出:"110"
解释:(-2) ^ 2 + (-2) ^ 1 = 2
示例2:
输入:3
输出:"111"
解释:(-2) ^ 2 + (-2) ^ 1 + (-2) ^ 0 = 3
示例3:
输入:4
输出:"100"
解释:(-2) ^ 2 = 4
提示:
0<=N<=10^9
解题思路
“将二进制位加上负号”进行考虑。每次处理二进制的末位。具体过程见参考代码。
参考代码
class Solution
{
public:
string baseNeg2(int N)
{
if(N==0)
return "0";
string ret="";
bool flag=true;//符号表示,true为正
while(N)
{
if(N&1)
{
if(flag)
N-=1;
else
N+=1;
ret="1"+ret;
}
else
ret="0"+ret;
N>>1;
flag=!flag;
}
return ret;
}
}
1030.链表中的下一个更大节点
题目描述
给出一个以头节点 head 作
为第一个节点的链表。链表中的节点分别编号为:node_1, node_2, node_3, ...
。
每个节点都可能有下一个更大值(next larger value):对于 node_i
,如果其 next_larger(node_i)
是 node_j.val
,那么就有 j > i
且 node_j.val > node_i.val
,而 j
是可能的选项中最小的那个。如果不存在这样的 j
,那么下一个更大值为 0
。
返回整数答案数组 answer
,其中 answer[i] = next_larger(node_{i+1})
。
注意: 在下面的示例中,诸如 [2,1,5]
这样的输入(不是输出)是链表的序列化表示,其头节点的值为 2,第二个节点值为 1,第三个节点值为 5 。
示例1:
输入:[2,1,5]
输出:[5,5,0]
示例2:
输入:[2,7,4,3,5]
输出:[7,0,5,5,0]
示例3:
输入:[1,7,5,1,9,2,5,1]
输出:[7,9,9,9,0,5,0,0]
提示:
- 对于链表中的每个节点,
1 <= node.val <= 10^9
- 给定列表的长度在
[0, 10000]
范围内
解题思路
需要用到单调栈的思想。单调栈是栈内元素单调递增或单调递减的栈,单调栈只能在栈顶操作。
单调栈的一些性质如下:
- 单调栈的元素具有单调性
- 元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除
- 使用单调栈可以找到元素向左遍历第一个比其小的元素(递增栈),也可以找到元素向左遍历第一个比它大的元素(递减栈)
这里应用递减栈。首先,遍历链表,建立记录链表节点值的数组。随后应用单调栈,当新加入的元素小于栈顶元素,则直接入栈,大于时则将栈顶元素弹出,并且将答案中此处对应的值设置为当前即将入栈元素,直到栈顶元素大于当前元素。
具体实现细节见参考代码。
参考代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def nextLargerNodes(self, head: ListNode) -> List[int]:
value=[]
temp=head
while temp:
value.append(temp.val)
temp=temp.next
n=len(value)
ans=[0]*n
stack=[0] #记录value中值的索引
i=1
while i<n:
if value[i]<=value[stack[-1]]:
stack.append(i)
else:
while len(stack)!=0 and value[stack[-1]]<value[i]:
ans[stack[-1]]=value[i]
stack.pop(-1)
stack.append(i)
i+=1
return ans