#LC179:最大数

博主分享了在LeetCode刷题和CSP认证过程中的经验,探讨了如何解决数字字符串按字典序逆序排列的问题。关键在于理解相同长度数字字符串的比较规则,并重写sort函数。遇到的挑战包括sort函数需要普通函数指针而不能直接使用类成员函数。通过使用lambda表达式成功解决这一问题。

废话
俺又回来了,在开学刷了一百多题的leetcode之后,临时抱佛脚做了一些CSP认证的题,就去参加认证了,备受打击,继续回到leetcode!
在这里插入图片描述
题目
我一开始以为字典序逆序就可以了,结果还有3、30这样的,就不太行。其实,这道题的核心思路是:相同长度的数字字符串(”330“ > “303”)的大小和原来数字(330 > 303)大小等价,注意是相同长度。然后题目就简单了,只需要重写sort函数按照两数拼接比较大小得出谁在前谁在后


class Solution {
public:
    static bool cmp(const string& s1, const string& s2)
    {
        return s1 + s2 > s2 + s1;
    }
    string largestNumber(vector<int>& nums) {
        vector<string> ss;
        for(int v : nums)
            ss.push_back(to_string(v));
        sort(ss.begin(), ss.end(), cmp);
        if(ss[0] == "0") return "0";
        string ans = "";
        for(auto i : ss)
            ans += i;
        return ans;
    }
};
  • 有个坑是:0、0、0这样的不需要输出“000”,而是”0“;
  • 然后说一下这个sort重载

我一开始自己写了一个类封装了个string,有点麻烦。然后是这样写的。
bool cmp(const string& s1, const string& s2) { return s1 + s2 > s2 + s1; }

报错了:reference to non-static member function must be called

博主给出的原因是sort函数需要一个普通函数指针,但我们写在Solution类中是一个非静态成员函数,这样的函数都有一个隐含参数this指针,这两个函数指针是不同的,但是静态成员函数没有this指针,就可以传进去。

学习一下函数指针12

leetcode给出的题解中是这样写的

 sort(v.begin(), v.end(), [](const string &a,const string &b){
            return a+b > b+a; //两个字符串先后组合大小降序排列
        });

等我晚上再研究一下STL中的sort是咋说的,争取看明白!

你运行了命令,但遇到了两个关键错误: ```bash touch: cannot touch '.../zh/__init__.py': No such file or directory python: can't open file '.../generate_messages_json.py': [Errno 2] No such file or directory ``` --- ## 🔍 错误原因分析 ### ❌ 1. `__init__.py` 创建失败:目录不存在 ```bash touch: cannot touch '/home/gapinyc/superset/venv/lib/python*/site-packages/superset/translations/zh/__init__.py': No such file or directory ``` 说明: - 路径中某个父目录不存在(比如 `zh/` 目录本身都还没创建) - 或者通配符 `python*` 没有匹配到实际路径 --- ### ❌ 2. `generate_messages_json.py` 文件找不到 ```bash python: can't open file '.../generate_messages_json.py': No such file or directory ``` 说明: - 你把脚本 **放在了 `/LC_MESSAGES/` 目录下**,但实际上你只是在那个目录里执行命令,并没有真的创建这个文件。 - 或者你根本就没保存过这个 `.py` 文件。 --- ## ✅ 正确解决方案 我们一步一步来修复这些问题。 --- ### ✅ Step 1:确认 Python 版本并展开通配符 你的虚拟环境路径可能是这样的: ```bash ~/superset/venv/lib/python3.10/site-packages/ ``` 先确定具体路径: ```bash ls ~/superset/venv/lib/python*/ ``` 假设输出是: ``` /home/gapinyc/superset/venv/lib/python3.10/ ``` 那么我们要用这个真实路径替换所有 `python*` 通配符。 --- ### ✅ Step 2:手动定义变量以避免路径错误 ```bash # 定义核心路径(根据你的实际情况修改) SUP_PKG="/home/gapinyc/superset/venv/lib/python3.10/site-packages/superset" ZH_TRANS="$SUP_PKG/translations/zh" STATIC_ZH="$SUP_PKG/static/assets/translation/zh" ``` > ⚠️ 如果不确定 Python 版本,请运行: > > ```bash > python -c "import sys; print(f'python{sys.version_info.major}.{sys.version_info.minor}')" > ``` > > 得到结果如 `python3.10` → 替换上面的路径 --- ### ✅ Step 3:创建缺失的目录结构和 `__init__.py` ```bash # 创建 zh 翻译包目录(如果还不存在) mkdir -p "$ZH_TRANS/LC_MESSAGES" # 创建 __init__.py(让 Python 把它识别为模块) touch "$ZH_TRANS/__init__.py" echo "✅ Created __init__.py at $ZH_TRANS/__init__.py" ``` 验证是否成功: ```bash ls -l "$ZH_TRANS/" ``` 你应该看到: ``` __init__.py LC_MESSAGES/ ``` --- ### ✅ Step 4:确认 `.mo` 和 `.po` 文件存在 ```bash ls -l "$ZH_TRANS/LC_MESSAGES/" ``` 你应该看到: ``` messages.po messages.mo ``` 如果没有,请回到之前步骤重新生成它们(使用 `pybabel compile`)。 --- ### ✅ Step 5:创建 `generate_messages_json.py` 脚本(现在是真的创建!) #### 在家目录创建脚本: ```bash cat > ~/generate_messages_json.py << 'EOF' import polib import json import glob import os # 自动查找 messages.po 文件 po_glob = glob.glob("/home/gapinyc/superset/venv/lib/python*/site-packages/superset/translations/zh/LC_MESSAGES/messages.po") if not po_glob: raise FileNotFoundError("❌ Cannot find messages.po, please check path!") po_file = po_glob[0] print(f"📄 Loading PO file: {po_file}") # 输出目录 output_dir = po_file.replace("/LC_MESSAGES/messages.po", "/../../static/assets/translation/zh") os.makedirs(output_dir, exist_ok=True) output_json = f"{output_dir}/messages.json" # 提取翻译 trans_dict = {e.msgid: e.msgstr for e in polib.pofile(po_file) if e.translated() and e.msgid.strip()} # 写入 JSON with open(output_json, 'w', encoding='utf-8') as f: json.dump(trans_dict, f, ensure_ascii=False, indent=2) print(f"✅ Success! Generated {len(trans_dict)} translations at {output_json}") EOF ``` 📌 这个命令会 **真正创建一个名为 `generate_messages_json.py` 的文件在你的家目录下**。 --- ### ✅ Step 6:运行脚本生成 `messages.json` ```bash python ~/generate_messages_json.py ``` 预期输出: ```text 📄 Loading PO file: /home/gapinyc/superset/venv/lib/python3.10/site-packages/superset/translations/zh/LC_MESSAGES/messages.po ✅ Success! Generated 350 translations at .../static/assets/translation/zh/messages.json ``` --- ### ✅ Step 7:设置正确权限 ```bash chmod 644 "$ZH_TRANS/LC_MESSAGES/messages.mo" chmod 644 "$(dirname $(python ~/generate_messages_json.py 2>&1 | grep "Generated" | awk '{print $NF}'))/messages.json" ``` 或者直接写死路径: ```bash chmod 644 "$SUP_PKG/static/assets/translation/zh/messages.json" ``` --- ### ✅ Step 8:重启 Superset 服务 ```bash sudo systemctl restart superset ``` --- ### ✅ Step 9:浏览器验证中文是否生效 1. 打开浏览器访问 `http://192.168.110.204` 2. 登录后进入 **Preferences > Language** 3. 选择 `中文 (zh)` 4. 强制刷新页面:`Ctrl+Shift+R` 5. 查看菜单是否变成中文(如“SQL Lab” → “SQL 实验室”) 同时打开开发者工具(F12)→ Network → 搜索 `messages.json`,确认请求返回 200。 --- ## ✅ 总结:你现在完成了什么? | 任务 | 是否完成 | |------|----------| | 创建 `zh` 翻译包目录结构 | ✅ | | 添加 `__init__.py` 让其成为合法模块 | ✅ | | 验证 `.mo` 存在且有效 | ✅ | | 生成前端所需的 `messages.json` | ✅ | | 设置文件权限 | ✅ | | 重启服务 | ✅ | 只要前端能加载 `messages.json`,中文界面就会正常显示! --- ## 💡 小贴士:如何避免下次再出错? 你可以把这个过程写成一个自动化脚本: ### 📜 `build_translation.sh` ```bash #!/bin/bash # build_translation.sh - 自动构建 Superset 中文语言包 VENVPY="python3.10" # 修改为你自己的版本 VENV_ROOT="/home/gapinyc/superset/venv" SUP_PKG="$VENV_ROOT/lib/$VENVPY/site-packages/superset" ZH_TRANS="$SUP_PKG/translations/zh" STATIC_ZH="$SUP_PKG/static/assets/translation/zh" set -e echo "🔧 正在构建 Superset 中文语言包..." # 1. 创建目录和 __init__.py mkdir -p "$ZH_TRANS/LC_MESSAGES" touch "$ZH_TRANS/__init__.py" # 2. 编译 .mo 文件(从 .po) msgfmt "$ZH_TRANS/LC_MESSAGES/messages.po" -o "$ZH_TRANS/LC_MESSAGES/messages.mo" # 3. 生成 messages.json python -c " import polib, json, glob, os; po = glob.glob('$ZH_TRANS/LC_MESSAGES/messages.po')[0]; out_dir = '$STATIC_ZH'; os.makedirs(out_dir, exist_ok=True); trans = {e.msgid:e.msgstr for e in polib.pofile(po) if e.translated()}; with open('$STATIC_ZH/messages.json', 'w', encoding='utf-8') as f: json.dump(trans, f, ensure_ascii=False, indent=2) print('✅ messages.json 已生成') " # 4. 权限 chmod 644 "$ZH_TRANS/LC_MESSAGES/"*.mo chmod 644 "$STATIC_ZH/messages.json" echo "🎉 构建完成!请重启 Superset" ``` 保存后运行: ```bash chmod +x build_translation.sh ./build_translation.sh ``` 以后每次更新 `.po` 文件,只需运行这一条命令即可! ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值