Leetcode第130场周赛题目学习

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

提示:

  1. 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 > inode_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. 对于链表中的每个节点,1 <= node.val <= 10^9
  2. 给定列表的长度在 [0, 10000] 范围内

解题思路

需要用到单调栈的思想。单调栈是栈内元素单调递增或单调递减的栈,单调栈只能在栈顶操作。
单调栈的一些性质如下:

  1. 单调栈的元素具有单调性
  2. 元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除
  3. 使用单调栈可以找到元素向左遍历第一个比其小的元素(递增栈),也可以找到元素向左遍历第一个比它大的元素(递减栈)

这里应用递减栈。首先,遍历链表,建立记录链表节点值的数组。随后应用单调栈,当新加入的元素小于栈顶元素,则直接入栈,大于时则将栈顶元素弹出,并且将答案中此处对应的值设置为当前即将入栈元素,直到栈顶元素大于当前元素。
具体实现细节见参考代码。

参考代码

# 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

你可能感兴趣的:(Leetcode刷题-周赛)