{ }codelper
比较字符串P0056

按字典序比较两个单词

第一行给出询问数 q。
接下来 q 行,每行给出两个英文单词 a、b,用一个空格隔开。
对每个询问,a 在 b 之前输出 -1,相同输出 0,在 b 之后输出 1,各占一行。
先后按字符编码(ASCII)决定:从第一个字符开始依次比较,第一个不同的字符编码较小的一方在前。
按这个规则,所有大写字母(A–Z,65–90)都在所有小写字母(a–z,97–122)之前,所以 "Zoo" 在 "apple" 之前。
如果一个单词与另一个单词的开头部分相同("app" 和 "apple"),短的在前。

输入
1 ≤ q ≤ 1,000。
单词由英文大小写字母组成,长度 1 到 20
输出
q 行,每行是 -1、0、1 之一
样例 1 · stdin
4
apple banana
app apple
Zoo apple
same same
stdout
-1
-1
-1
0
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

比较字符串大小:Python、JS、TS、C++、Craykon 直接写 a < b(都按字符编码)。
Java a.compareTo(b)、C strcmp(a, b)、C++ a.compare(b)、C# string.Compare(a, b, StringComparison.Ordinal) 返回负数、0 或正数,**并不保证是 -1 和 1。
** Java 的 compareTo 返回第一个不同字符的编码差("a" 与 "c" 是 -2)或长度差,C 的 strcmp 视实现也可能返回字符差。
所以要用 Integer.signum、Math.Sign 或 (r > 0) - (r < 0) 只保留符号。
Python 没有三向比较函数,用 (a > b) - (a < b) 构造。
大小写陷阱:C# 的 string.Compare(a, b)(不带 StringComparison)按区域文化规则,"a" 会排在 "B" 前面,JS 的 a.localeCompare(b) 也一样。
要按字符编码顺序,C# 用 Ordinal,JS 用 <。

Pythonmain.py · 4 行
q = int(input())for _ in range(q):    a, b = input().split()    print((a > b) - (a < b))
JavaScriptmain.js · 7 行
const [q, ...lines] = require("fs").readFileSync(0, "utf8").split("\n").map((x) => x.trim());const out = [];for (let i = 0; i < Number(q); i++) {  const [a, b] = lines[i].split(" ");  out.push(a < b ? -1 : a > b ? 1 : 0);}console.log(out.join("\n"));
TypeScriptmain.ts · 8 行
import { readFileSync } from "node:fs";const [q, ...lines]: string[] = readFileSync(0, "utf8").split("\n").map((x) => x.trim());const out: number[] = [];for (let i = 0; i < Number(q); i++) {  const [a, b]: string[] = lines[i].split(" ");  out.push(a < b ? -1 : a > b ? 1 : 0);}console.log(out.join("\n"));
JavaMain.java · 16 行
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        int q = Integer.parseInt(br.readLine().trim());        StringBuilder out = new StringBuilder();        for (int i = 0; i < q; i++) {            String[] p = br.readLine().trim().split(" ");            // compareTo는 -1/1이 아니라 "차이"를 돌려주므로 부호만 남긴다            out.append(Integer.signum(p[0].compareTo(p[1]))).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 18 行
using System;using System.Text; class Program{    static void Main()    {        int q = int.Parse(Console.ReadLine());        var out_ = new StringBuilder();        for (int i = 0; i < q; i++)        {            string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            // 글자 코드로 비교하려면 Ordinal(기본 string.Compare는 문화권 규칙을 따른다)            out_.Append(Math.Sign(string.Compare(p[0], p[1], StringComparison.Ordinal))).Append('\n');        }        Console.Write(out_);    }}
C++main.cpp · 13 行
#include <iostream>#include <string> int main() {    std::ios::sync_with_stdio(false);    int q;    std::string a, b;    std::cin >> q;    for (int i = 0; i < q; i++) {        std::cin >> a >> b;        std::cout << (a < b ? -1 : a > b ? 1 : 0) << '\n';    }}
Cmain.c · 14 行
#include <stdio.h>#include <string.h> int main(void) {    int q;    char a[32], b[32];    if (scanf("%d", &q) != 1) return 0;    for (int i = 0; i < q; i++) {        scanf("%31s %31s", a, b);        int r = strcmp(a, b);  /* 부호만 정해져 있다: 음수, 0, 양수 */        printf("%d\n", (r > 0) - (r < 0));    }    return 0;}
Craykonmain.cray · 19 行
q = 控制台.读行().转数字();循环 (i = 0; i < q; i++){    words = 控制台.读行().分割();    a = words[0];    b = words[1];    如果 (a < b)    {        控制台.输出(-1);    }    否则 如果 (a > b)    {        控制台.输出(1);    }    否则    {        控制台.输出(0);    }}