【NC16783】拼数

题目

拼数

自定义字符串排序

思路

经过观察可以知道:越高位的数越大,这个数就应该排在越前面的位置,比如 4321 4321 4321 和 4331 4331 4331,则 4331 4331 4331 应该排在前面。

所以将给出的整数转为字符串更容易操作。

将数转为字符串之后,可以对这个字符串数组进行排序,排序规则如下:

对两个字符串从左往右遍历:

  1. 如果对应位置的字符相同则相同,否则直到对应位置的字符不相同,字符串大小由第一个不相同的字符大小决定;
  2. 如果其中某个字符串的长度小于另一个,也就是说字符串 a a a 是字符串 b b b 的前缀,则判断字符串 b b b 的首尾字符大小:
    2.1 如果字符串 b b b 的首字符大于字符串 b b b 的尾字符,则规定字符串 b b b 小于字符串 a a a
    2.2 如果字符串 b b b 的首字符小于等于字符串 b b b 的尾字符,则规定字符串 b b b 大于字符串 a a a

代码

cpp 复制代码
// 纯C语言
#include <stdio.h>
#include <stdlib.h>  // qsort()
#include <string.h>  // strcmp() 等
#define N 20

// 字符串比较函数
int cmp(const void* a, const void* b) {
    const char* aa = (const char*)a;
    const char* bb = (const char*)b;
    int p = strlen(aa), q = strlen(bb);
    // 如果是前缀,则判断首尾字符的大小
    if (!strncmp(aa, bb, p) && bb[0] > bb[q - 1]) return 114514;
    if (!strncmp(bb, aa, q) && aa[0] > aa[p - 1]) return -114514;
    return strcmp(aa, bb);
}

int main(void) {
    int n = 0, i = 0, j = 0, p = 0, q = 0;
    scanf("%d", &n);
    char s[n][N];
    for (i = 0; i < n; i++) {
        scanf("%s", s[i]);
    }
    qsort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), cmp);
    for (i = n - 1; i >= 0; i--) {
        printf("%s", s[i]);
    }
    printf("\n");
    return 0;
}
相关推荐
一个行走的民10 分钟前
深度剖析 Ceph PG 分裂机制:原理、底层、实操、影响、线上避坑(最全完整版)
ceph·算法
WolfGang00732113 分钟前
代码随想录算法训练营 Day46 | 图论 part04
算法·图论
拾-光20 分钟前
LTX-Video 2.3 实战:用图片生成视频,消费级显卡也能跑的开源 I2V 模型(GPT Image 2)
java·人工智能·python·深度学习·算法·机器学习·音视频
小O的算法实验室24 分钟前
2026年ESWA,考虑曲率约束路径优化的 Dubins-RRT* 运动规划算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
jllllyuz25 分钟前
灰狼算法优化的LSSVR程序
算法
杨校32 分钟前
杨校老师课堂之栈结构的专项训练
算法
故事和你9143 分钟前
洛谷-算法2-2-常见优化技巧3
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
菜鸟555551 小时前
2025江西省CCPC省赛暨全国邀请赛(南昌)
数据结构·c++·算法·acm·思维·ccpc·xcpc
lds走自己的路1 小时前
全局坐标转局部坐标推导
人工智能·算法·机器学习
杨校1 小时前
杨校老师课堂之C++高精度乘法
算法