dummy|trick
lc481
交替出现 实现构造
for (int i = 2; s.length() < n; ++i)
s += string(s[i], s.back() ^ 3); // 1^3=2, 2^3=1,这样就能在 1 和 2 之间转换

class Solution {
public:
int magicalString(int n)
{
string s = "\1\2\2"; // 值就是 1,2,2,这样就可以直接用 s[i] 当作个数
for (int i = 2; s.length() < n; ++i)
s += string(s[i], s.back() ^ 3); // 1^3=2, 2^3=1,这样就能在 1 和 2 之间转换
return count(s.begin(), s.begin() + n, 1);
}
};
另一种写法_直接构造
const int MX = 1e5;
int acc[MX + 1];
int init = []() {
string s = "\1\2\2";
for (int i = 2; s.length() < MX; ++i)
s += string(s[i], s.back() ^ 3); // 1^3=2, 2^3=1,这样就能在 1 和 2 之间转换
for (int i = 0; i < MX; ++i)
acc[i + 1] = acc[i] + 2 - s[i]; // 2-1=1,2-2=0,这样就只统计了 1
return 0;
}();
class Solution {
public:
int magicalString(int n) {
return acc[n];
}
};
lc1679
class Solution {
public:
int maxOperations(vector<int>& nums, int k)
{
unordered_map<int,int> hash;
for(auto num:nums)
hash[num]++;
int ret=0;
for(auto [a,b]:hash)
{
if(hash.count(k-a))
ret+=min(hash[a],hash[k-a]);
}
return ret/2;
}
};
lc817
hash快速查 nums 中的值,遍历链表时通过标记判断是否进入新的连续含 nums 值的片段,统计这种片段(组件)的总数并返回。
class Solution {
public:
int numComponents(ListNode* head, vector<int>& nums) {
unordered_set st(nums.begin(),nums.end());
int ans =0;
bool ok =false; //标记上个元素是否被访问
for(auto p = head;p;p=p->next)
{
if(!ok && st.contains(p->val)) ans++;
ok = st.contains(p->val);
}
return ans;
}
};
逆天中文翻译,可以直接看示例1写代码即可
示例1:
- 链表是 0 → 1 → 2 → 3 (每个节点的值依次是0、1、2、3)。
- nums 是 [0,1,3] (即nums里包含0、1、3这三个值)。
“组件”的定义是链表中一段最长的连续节点,且这些节点的值都在nums里。
我们逐个看链表节点:
- 节点0:值在nums里;
- 节点1:值在nums里,且和节点0是连续的,所以这两个节点构成一个连续片段 [0,1] ;
- 节点2:值不在nums里,断开了连续;
- 节点3:值在nums里,且前面没有连续的、值在nums里的节点了,所以单独构成一个片段 [3] 。
这样就有两个这样的片段,所以输出是2
lc3217
hash快速查询 nums 中的值
再通过“哨兵节点”遍历链表,删除所有节点值在 nums 中的节点
最后返回修改后的链表头
class Solution {
public:
ListNode* modifiedList(vector<int>& nums, ListNode* head) {
unordered_set<int> st(nums.begin(), nums.end());
ListNode dummy(0, head);
ListNode* cur = &dummy;
while (cur->next)
{
ListNode* nxt = cur->next;
if (st.contains(nxt->val))
cur->next = nxt->next; // del
else
cur = nxt; // not del
}
return dummy.next;
}
};
