加载中...

错题本 | LeetCode953. 验证外星语词典

题目链接:https://leetcode-cn.com/problems/verifying-an-alien-dictionary/

题目分析:由题目给定字符的大小等级,依照此等级比较字符串大小。

解题思路:定义一个数组order_rank[26],给定某个字符c, order_rank['a' - c]表示该字符在order中的位置。

错误记录:程序第32行,原本写作:while (words1[idx] == words2[idx]),这样的写法无法满足两个字符串相等的情况(即两个字符串每个字符都相等,包括最后的\0符号也相等,产生了溢出,理论上循环将在字符串后的某个位置上停止。

更正:循环中判断两个字符的终止,改为while (words1[idx] == words2[idx] && words1[idx] != '\0' && words2[idx] != '\0')

AC代码:

class Solution {
public:
    int order_rank[26];
    bool isAlienSorted(vector<string>& words, string order) {
        vector<string>::iterator ite;
        bool ret = true;
        set_rank(order);  // 设置order_rank数组

        for (ite = words.begin(); ite != words.end(); ++ite)  // 两两对比
        {
            if (ite != words.end() - 1)
            {
                if (cmp(*ite, *(ite + 1)) > 0)  // cmp返回正数,前者比后者大
                {
                    ret = false;
                    break;
                }
            }
        }
        return ret;
    }
    void set_rank(string order)
    {
        int idx = 0;
        for (idx = 0; idx < 26; ++idx)
        {
            order_rank[order[idx] - 'a'] = idx;  // 得到每个字母的顺序,rank越小,出现越早,等级越低
        }
    }
    int cmp(string words1, string words2) {
        int idx = 0;
        while (words1[idx] == words2[idx] && words1[idx] != '\0' && words2[idx] != '\0')
        {
            ++idx;
        }
        // 循环结束,word1[idx] != words2[idx]
        // 分三种情况
        if (words1[idx] == '\0')  // words1到达末尾
        {
            if (words2[idx] == '\0')
                return 0;
            else
                return -1;  // word1 < words2
        }
        else if (words2[idx] == '\0')  // words2 到达末尾
        {
            return 1;  // word1 > words2
        }
        else  // 出现不相等,比较两者字符的rank,越低的越小
            return order_rank[words1[idx] - 'a'] - order_rank[words2[idx] - 'a'];
            // words1[idx]的rank更小,返回负数
    }
};
9 comments
Anonymous
Markdown is supported
@mpv945
mpv945commentedover 2 years ago

添加图片,如果使用外部图床的http链接 。图片无法点击放大,你那边怎么解决的?

@SGS4ever
SGS4evercommentedover 2 years ago

@mpv945
添加图片,如果使用外部图床的http链接 。图片无法点击放大,你那边怎么解决的?

我的博客没有使用图床,所以没办法帮到你~

@Celetherin
Celetherincommentedabout 2 years ago

您好,我也是使用的stack主题,我在照着您的方法添加返回顶部按钮时,遇到了按钮虽然出现、也能够点击,但无法实现实际上的返回顶部功能的问题,我没有任何的代码知识,不知道您有没有解决方法?
另外,也是想提醒一下其他需要这篇教程的朋友,最新版的stack主题,添加返回按钮的组件应该在layouts/partials/sidebar/right.html, 在layouts/_default/single.html中添加代码会导致出现两个右边栏。

@jsjcjsjc
jsjcjsjccommentedalmost 2 years ago

请教一下博主,如何优雅的给stack主题添加广告哈?
我只想在左或者右侧边栏底部,或者每篇文章底部添加一个小小的广告,但是默认似乎的满屏广告哈~~
感谢

@SGS4ever
SGS4evercommentedalmost 2 years ago
@ClimbingMouse
ClimbingMousecommentedover 1 year ago

你好,按照你的方法设置页面载入动画,这个动画不会停止咋办啊

@46fafa
46fafacommentedover 1 year ago

博主你好,请问一下主页布局修改哪里的代码如何作用于整个网页,我发现修改后的布局只存在主页和前两篇文章,其他部分还是没修改的样子

@4kohakunushi
4kohakunushicommentedabout 1 year ago

你好,关于左侧栏图标高亮我这里存在一些问题想请教你。我取消了原本主页直接抓取post的内容在中间显示的版块,这个部分改成了其他东西,与此同时新增了一个抓取post信息的与links、search等目录并列的一个目录,现在的问题是这些部分虽然都能正常显示,但是对应的抓取post的那个目录无法选中以后高亮,应该修改增加什么才能让它也可以选中后高亮呢?

@SGS4ever
SGS4evercommented12 months ago

首先我只能基于本文使用的Stack版本来尝试解答,因为没看过当前的Stack主题的代码~
我重新翻了下此前写的关于高亮的内容,理论上只要你的post页面的标题在menu配置中即可高亮。如果post页面是你站点的根路径,那应该可以参考我的文章里写的方法,修改下active的触发逻辑~

@4kohakunushi
你好,关于左侧栏图标高亮我这里存在一些问题想请教你。我取消了原本主页直接抓取post的内容在中间显示的版块,这个部分改成了其他东西,与此同时新增了一个抓取post信息的与links、search等目录并列的一个目录,现在的问题是这些部分虽然都能正常显示,但是对应的抓取post的那个目录无法选中以后高亮,应该修改增加什么才能让它也可以选中后高亮呢?

有朋自远方来,不亦说乎?