LeetCode Various 2

大冬天来几道简单的LeetCode暖暖身

 

T.876 链表的中间结点

题目描述:

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

 

示例:

输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

 

思路:

使用两个快慢指针分别遍历链表,快指针一次2,慢指针一次1,当快指针走到表尾,慢指针正好到中间。

 

代码:

/**
 * 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:
    ListNode* middleNode(ListNode* head) {
        ListNode* p, *q;
        p = head; q = head;
        while(p != nullptr && p->next != nullptr) {
            p = p->next->next;
            q = q->next;
        }
        return q;
    }
};

 

T.557 反转字符串中的单词

题目描述:

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

 

示例:

输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

 

思路:

双指针遍历字符串,注意空格情况和句尾情况。

 

代码:

class Solution {
public:
    string reverseWords(string s) {
        int begin = 0, end = 0;
        for(int i = 0; i <= s.size(); i++){
            if(s[i] == ' ' || s[i] == '\0'){
                end = i;
                reverse(s.begin() + begin, s.begin() + end);
                begin = end + 1;
                end = 0;
            }
        }
        return s;
    }
};

 

T.283 移动零

题目描述:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

 

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

 

思路:

运用STL的函数,通过erase和remove函数组合实现删除功能。

 

代码:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int len = nums.size(), zeroNums = count(nums.begin(), nums.end(), 0);
        nums.erase(remove(nums.begin(), nums.end(), 0), nums.end());
        nums.resize(len);
    }
};

 

T.189 轮转数组

题目描述:

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

 

示例:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

 

思路:

创建一个新数组,将翻转位数位的数放置在最前,再处理翻转未翻转的位。

 

代码:

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int len = nums.size();
        k %= len;
        vector<int> res;
        res.assign(nums.begin(), nums.end()); //复制容器函数
        for(int i = k; i < len; i++) {
            nums[i] = res[i - k];
        }
        for(int i = 0; i < k; i++) {
            nums[i] = res[len - k + i];
        }
    }
};

 

posted @ 2022-01-18 10:34  HM-7  阅读(34)  评论(0)    收藏  举报