125. 验证回文串
题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
解题思路
很基本的思路,双指针
bool isPalindrome(char * s)
{
int len = strlen(s);
int l = 0, r = len-1;
while (l < r)
{
// 跳过其他字符
while (s[l] < '0' || (s[l] > '9' && s[l] < 'A') || (s[l] > 'Z' && s[l] < 'a') || s[l] > 'z')
{
l ++;
if (l == r)
return true;
}
// 跳过其他字符
while (s[r] < '0' || (s[r] > '9' && s[r] < 'A') || (s[r] > 'Z' && s[r] < 'a') || s[r] > 'z')
{
r --;
if (r == l)
return true;
}
if (((s[l] != s[r]) && (s[l] + 32 != s[r]) && (s[l] - 32 != s[r]) ) || ((s[l] <= '9' && s[r] > '9') || (s[l] > '9' && s[r] <= '9'))) // || 前面是判断同时为字母, || 后面是一个为数字一个为字母的情况
return false;
l ++; r--;
}
return true;
}
83. 删除排序链表中的重复元素
题目描述
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
解题思路
双指针
struct ListNode* deleteDuplicates(struct ListNode* head)
{
if (head == NULL || head->next == NULL)
return head;
struct ListNode* p = head, *q = head->next;
while (q != NULL)
{
while (p->val == q->val)
{
q = q->next;
if (q == NULL) // 相等元素为最后一个元素
{
p->next = q;
return head;
}
}
p->next = q; // 跳过相等元素
p = p->next; // p 指向q
q = q->next; // q继续往前
}
return head;
}