2021-12-06每日刷题打卡

2021-12-06每日刷题打卡

力扣——每日一题

1816. 截断句子

句子 是一个单词列表,列表中的单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。

例如,“Hello World”、“HELLO” 和 “hello world hello world” 都是句子。
给你一个句子 s 和一个整数 k ,请你将 s 截断 ,使截断后的句子仅含 前 k 个单词。返回 截断 s 后得到的句子。

示例 1:

输入:s = “Hello how are you Contestant”, k = 4
输出:“Hello how are you”
解释:
s 中的单词为 [“Hello”, “how” “are”, “you”, “Contestant”]
前 4 个单词为 [“Hello”, “how”, “are”, “you”]
因此,应当返回 “Hello how are you”

准备一个变量ans计数,遍历s的时候每遇到一个空格ans++,当遍历到底或者ans==k时结束遍历。用erase函数删除s.begin()+遍历到的下标-1到s.end()这段字符串,然后把剩下的字符串删除即可。

class Solution {
public:
    string truncateSentence(string s, int k) {
        int ans=0,l=0,n=s.size();
        while(l

力扣——剑指offer

剑指 Offer 25. 合并两个排序的链表

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

示例1:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

归并排序嗷归并排序

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode*p=new ListNode(-1);
        ListNode*o=p;
        while(l1&&l2)
        {
            if(l1->valval)
            {
                o->next=l1;
                l1=l1->next;
            }
            else
            {
                o->next=l2;
                l2=l2->next;
            }
            o=o->next;
            o->next=NULL;
        }
        while(l1)
        {
            o->next=l1;
            l1=l1->next;
            o=o->next;
            o->next=NULL;
        }
        while(l2)
        {
            o->next=l2;
            l2=l2->next;
            o=o->next;
            o->next=NULL;
        }
        return p->next;
    }
};

剑指 Offer 52. 两个链表的第一个公共节点

输入两个链表,找出它们的第一个公共节点。

如下面的两个链表:

在节点 c1 开始相交。

2021-12-06每日刷题打卡_第1张图片

示例 1:

2021-12-06每日刷题打卡_第2张图片

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

这里我们可以利用双指针的写法,一个p指向headA,一个q指向headB,开始准备两个指针同步走,每次判断一下,如果p为空就指向headB的开头,不为空p就往下走一格,q同理,为空指向headA,不为空就往下走。当p和q相等时,结束遍历。

原理:假设A的长度为n,B的长度为m,p先走完A后去走B,走过的长度为n+m,q先走完B后去走A,走过的长度为m+n,此时可以注意到,p和q走的长度是一样的,也就是说p和q最终一定会有相等的情况,如果有交点,那么第一个相遇的地方就会是交点,如果没有交点,那么最后p和q都会为NULL。不管那种情况,直接返回q或p的其中一个就可以。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(!headA||!headB)return NULL;
        ListNode*p=headA,*q=headB;
        while(p!=q)
        {
            p=p==NULL?headB:p->next;
            q=q==NULL?headA:q->next;
        }
        return q;
    }
};

你可能感兴趣的:(算法,c++,开发语言)