[NOIP1998 提高组] 拼数(字符串排序)

题目描述

设有 n 个正整数 a_1 ... a_n,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

输入格式

第一行有一个整数,表示数字个数 n。

第二行有 n 个整数,表示给出的 n 个整数 a_i。

输出格式

一个正整数,表示最大的整数

样例 #1

样例输入 #1
3
13 312 343

样例输出 #1
34331213

样例 #2

样例输入 #2
4
7 13 4 246

样例输出 #2
7424613

提示

对于全部的测试点,保证 1 <= n <= 20,1 <= a_i <= 10^9。

这道题虽然是排列数字,但是用字符串来排序更简单一些。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int cmp(string s1, string s2)
{
    return s1 + s2 > s2 + s1;
}
int main()
{
    int n;
    cin >> n;
    string s[25];
    for (int i = 0; i < n; i++)
    {
        cin >> s[i];
    }
    sort(s, s + n, cmp);
    for (int i = 0; i < n; i++)
        cout << s[i];
}

再给一些字符串字典序用法。

在计算机编程中,可以对字符串按照字典序(字符的ASCII码值)进行排序,或者使用自定义的比较函数来实现特定的排序规则。

在大多数编程语言中,都提供了排序函数或排序库,可以直接对字符串数组进行排序。例如,C++中可以使用std::sort函数来对字符串数组进行排序,如前面给出的代码所示。

示例1:按字典序排序(默认的字符串排序方式)

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    string arr[] = {"banana", "apple", "orange", "grape"};
    int n = sizeof(arr) / sizeof(arr[0]);

    sort(arr, arr + n); // 默认按字典序排序

    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    return 0;
}

输出结果:

apple banana grape orange 

示例2:使用自定义的排序规则(按字符串长度降序排序)

#include <iostream>
#include <algorithm>
using namespace std;

bool cmp(string a, string b) {
    return a.length() > b.length(); // 按字符串长度降序排序
}

int main() {
    string arr[] = {"banana", "apple", "orange", "grape"};
    int n = sizeof(arr) / sizeof(arr[0]);

    sort(arr, arr + n, cmp); // 使用自定义的排序规则

    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    return 0;
}

输出结果:

banana orange apple grape 

在这个示例中,我们定义了一个自定义的比较函数cmp,它按照字符串长度的降序对字符串进行排序。

无论是按字典序还是自定义规则排序,字符串排序在编程中是一个常见且重要的操作。

大家对这句int n = sizeof(arr) / sizeof(arr[0]);是不是有疑问呢?

在C++中,数组的大小是固定的,一旦定义了数组,其大小就无法改变。所以,有时候我们需要知道数组中元素的个数,以便在后续的操作中进行循环遍历等操作。

上述语句中,arr 是一个数组,sizeof(arr) 表示整个数组所占用的字节数,而 sizeof(arr[0]) 表示数组中单个元素所占用的字节数。通过将整个数组的字节数除以单个元素的字节数,就可以得到数组中元素的个数。

例如,如果有一个整型数组 int arr[5];,那么 sizeof(arr) 将返回整个数组所占用的字节数,假设为 20 字节(假设 int 类型占用 4 个字节)。而 sizeof(arr[0]) 将返回单个元素 int 所占用的字节数,为 4 字节。因此,计算得到的 n 就是 20 / 4 = 5,表示数组中有 5 个元素。

在上述代码中,n 表示数组 arr 中元素的个数,以便在后续的操作(比如循环遍历)中使用。这种写法在不知道数组大小或者数组大小可能发生变化的情况下特别有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值