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]; } } };

浙公网安备 33010602011771号