leetcode -- 125、83

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

在这里插入图片描述

发布了184 篇原创文章 · 获赞 253 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/williamgavin/article/details/104483921