您的位置:首页 > 编程语言 > C语言/C++

LeetCode的数组242题和链表25题(C++)

2020-01-11 15:43 288 查看

数据结构的复习(结合LeetCode题目)

1. 数组

①题目:

  1. 有效的字母异位词
    给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:

输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:

输入: s = “rat”, t = “car”
输出: false
说明:
你可以假设字符串只包含小写字母。

进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

②解题思路:

用数组记录各个字母出现次数,如果最后全为0,就表示两字符串是字母异位词。
设置一个长度为26的数组,将初值全部赋为0。先用对应string头文件中包含的size()方法求得两字符串的长度,如果长度不等直接返回false。若相等就进行接下来的比较。根据长度遍历两字符串,对应数组字母位置上,s的++,t的–。然后遍历字母数组,只要发现有位置的数不是0,就返回false。最后return true。

③源码:

class Solution {
public:
bool isAnagram(string s, string t) {
int Alphabet[26] = {0};
int n= s.size();
int m = t.size();
if (n != m)
return false;
for (int i = 0; i < n; i++)
{
Alphabet[s[i] - 'a']++;
Alphabet[t[i] - 'a']--;
}
/*for (int i = 0; i < m; i++)
{
int j = t[i] - 'a';
Alphabet[j]--;
}*/
for (int i = 0; i < 26; i++)
{
if (Alphabet[i] != 0)
return false;
}
return true;
}
};

2.链表

①题目:

  1. K 个一组翻转链表
    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

②解题思路:

用链表结点的换位和递归,实现对k个结点一组的翻转。
先定义两个结点的指针,分别指向当前链表的头结点和NULL(空)。当链表不为空时,先遍历,计算链表长度,长度与k比较,只有当长度大于k时才进行链表的翻转。
根据k值,翻转k个结点(置为倒序)。先定义一个结点指针,保存要翻转结点的下一结点。然后将curr结点的next设置为prev(翻转后的“新”链表,初值为NULL)。然后让prev指向该“换了位”的结点,使curr指向未翻转的结点,进行接下来的翻转;最后让head->next指向递归产生的后续结点。(因为head一直指向的是原链表的第一个元素,所以转换后head->next应该指向接下来的结点。例如:原链表为1->2->3->4->5->,k=2;head指向1,将前两个元素换位后,变为2->1,head依然指向1,所以head->next应该指向新产生的后续结点)
最后返回prev即可。

③源码:

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* curr = head;
ListNode* prev=NULL;

if (head == NULL)
return 0;
int length = 0;
while (curr != NULL)
{
length++;
curr = curr->next;
}
curr = head;
if (k > length)
return head;

else
{
//换位置
for(int i=0;i<k;i++)
{
ListNode* next = NULL;
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
head->next=reverseKGroup(curr, k);
}
return prev;
}
};

结题思路有参考LeetCode上的解答,此博客仅用来记录一我的大致结题过程。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
宇zzZ 发布了5 篇原创文章 · 获赞 2 · 访问量 181 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: