数据结构的复习(结合LeetCode题目)
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.链表
①题目:
- 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上的解答,此博客仅用来记录一我的大致结题过程。