01. 统计链表奇数节点
给你一个链表的头节点 head,请统计链表中值为 奇数 的节点个数
示例 1:
输入: head = [2,1,8]
输出: 1
解释: 链表中存在 1 个奇数值的节点,值为 1
示例 2:
输入:head = [1,2,3,4]
输出:2
解释:链表中存在 2 个奇数值的节点,值分别为 1、3
提示:
- 链表中节点的数目在
[1, 5000]范围内。 1 <= Node.val <= 10000
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
int numberEvenListNode(ListNode* head) {
int res = 0;
while(head!= NULL){
if(head->val%2){
res++;
}
head = head->next;
}
return res;
}
};
02. 光线反射
工程师正在研究一个 N*M 大小的光线反射装置,装置内部的构造记录于 grid 中,其中
'.'表示空白区域,不改变光的传播方向'R'表示向右倾斜的 双面 均可反射光线的镜子,改变光的传播方向'L'表示向左倾斜的 双面 均可反射光线的镜子,改变光的传播方向
假如光线从装置的左上方垂直向下进入装置,请问在离开装置前,光线在装置内部经过多长的路线。
示例 1:
输入:grid = ["...","L.L","RR.","L.R"]
输出:12
解释:如图所示,光线经过路线长度为 12
示例 2:
输入:grid = ["R.",".."]
输出:1
解释:如图所示,光线经过路线长度为 1
提示:
1 <= grid.length, grid[i].length <= 100grid[i][j]仅为'L'、'R'和 '.'
题解:模拟
class Solution {
public:
int getLength(vector<string>& g) {
int res = 0;
int n = g.size(), m = g[0].size();
int i=0, j = 0, d = 2;
while(i >=0 && i < n && j >=0 && j < m){
res++;
if(g[i][j] == '.'){
if(d == 1){
j++;
}else if(d == 2){
i++;
}else if(d == 3){
j--;
}else{
i--;
}
}else if(g[i][j] == 'L'){
if(d == 1){
d = 2;
i++;
}else if(d == 2){
d = 1;
j++;
}else if(d == 3){
d = 4;
i--;
}else{
d = 3;
j--;
}
}else{
if(d == 1){
d = 4;
i--;
}else if(d == 2){
d = 3;
j--;
}else if(d == 3){
d = 2;
i++;
}else{
d = 1;
j++;
}
}
}
return res;
}
};
也可以参考灵神有很巧妙的方式来做。
03. 整理书架
书架上有若干本书,从左至右的书籍编号记于整型数组 order 中。为保证书籍多样性,管理员想取走一些重复编号的书籍,要求满足以下条件:
- 剩余书本中相同编号的书本数量均不大于
limit - 取走的书籍数量尽可能少
由于存在多种整理方案,请返回剩余书本编号的排列为「最小排列」的方案。
注意:
- 「最小排列」:若干数组中第一位数字最小的数组;若第一位数字相同,则为第二位数字最小的数组,以此类推。
示例 1:
输入:order = [5,5,6,5], limit = 2
输出:[5,5,6]
解释:order 中出现了 3 次 5 号书:
方案 1:去掉 order[0] 或 order[1],所得排列为 [5,6,5];
方案 2:去掉 order[3],所得排列为 [5,5,6];
经比较,最终返回排列最小的方案 2:[5,5,6]。
示例 2:
输入:order = [5,5,6,5], limit = 3
输出:[5,5,6,5]
解释:order 中所有相同编号的书本数目均未超过 limit,不需要去除,返回 [5,5,6,5]
示例 3:
输入:order = [3,3,9,8,9,2,8], limit = 1
输出:[3,8,9,2]
解释:列表中 3、8、9 号数字都出现了 2 次,去掉编号相同的书后的排列结果中 [3,8,9,2] 为排列最小的结果。
示例 4:
输入:order = [2,1,2,2,1,3,3,1,3,3], limit = 2
输出:[1,2,2,1,3,3]
提示:
1 <= order.length <= 10^51 <= limit <= 101 <= order[i] <= 10^6
题解: 单调栈
class Solution {
public:
vector<int> arrangeBookshelf(vector<int>& order, int limit) {
map<int, int> hash;
map<int, int> stk_hash;
for(auto c : order){
hash[c]++;
}
stack<int> stk;
for(auto c : order){
if(stk_hash[c] == limit){
hash[c]--;
continue;
}
while(!stk.empty() && c < stk.top() && hash[stk.top()] > limit){
hash[stk.top()]--;
stk_hash[stk.top()]--;
stk.pop();
}
stk_hash[c]++;
stk.push(c);
}
vector<int> res;
while(stk.size()){
res.push_back(stk.top());
stk.pop();
}
reverse(res.begin(), res.end());
return res;
}
};