class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++)
{
//这里注意要提前定义好iter,不然下面return的时候第一项表示不出来
// 遍历当前元素,并在map中寻找是否有匹配的key
auto iter=map.find(target-nums[i]);
//找到了,返回
if(iter!=map.end())
{
return {iter->second,i};
}
else
{
//如果没找到匹配对,就把访问过的元素和下标加入到map中
map.insert(pair<int,int>(nums[i],i));
}
}
//为了使得OJ能过
return {};
}
};
这个题就有点上难度了
模拟加法运算,设置进位数 t , t=(l1->val+l2->val+t)%10 即为当前位上的数, t/10 即是进位数。
设置哑结点,便于操作头结点。
模拟上述操作,最后返回哑结点的后继。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int t = 0;//进位
ListNode *dummy = new ListNode(0);
auto cur = dummy;
while(l1||l2){
if(l1) t+=l1->val,l1 = l1->next;
if(l2) t+=l2->val,l2 = l2->next;
cur->next = new ListNode(t%10);//当前位的数
cur = cur->next;
t/=10;//进位数
}
//这里就是处理进位不为0,下面的ListNode(1)也可以,因为最后剩的进位必然是1
if(t) cur->next = new ListNode(t);
return dummy->next;
}
};
定义两个左右指针,如下分别是i和j。
i用来遍历字符串,只要i位置字符集合中不存在,就插入到集合中。并且++len,然后更新一下max_len。记录 len 的最大状态。
如果发现i位置字符在集合中存在,就将其删去,且++j、––len。这个过程持续直到i位置字符可以插入为止。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//定义一个可以去重的set
unordered_set<char> set;
//定义j,类似于快慢指针中的慢指针
int j = 0;
//定义len作为当前结果,max_len作为最终结果
int len = 0, max_len = 0;
//定义i作为遍历的指针,类似于快慢指针中的快指针
for (int i = 0; i < s.size(); i++)
{
//当在set中找到i的时候,就把i删掉,len--
while (set.find(s[i]) != set.end()) {
set.erase(s[l++]);
len--;
}
//找不到i的时候,就把i加入,然后len++
set.insert(s[i]);
len++;
//比较,更新结果
if (max_len < len) max_len = len;
}
return max_len;
}
};