{ }codelper
文字の添字文字型P0053

文字が最初と最後に現れる位置

一行目に文字列 s、二行目に一文字 c が与えられる。
s の中で c が最初に現れる位置と最後に現れる位置を、空白一つで区切って出力せよ。
位置は 0 から数える。
c が s に一度も現れなければ "-1 -1" を出力する。
一度だけ現れるなら二つの数は同じになる。

入力
s は英小文字と数字、長さ 1〜1,000。
c は英小文字か数字の一文字
出力
最初の位置と最後の位置(なければ -1 -1)
例 1 · stdin
banana
a
stdout
1 5
例 2 · stdin
hello
z
stdout
-1 -1
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

最初の位置・最後の位置:Python s.find(c)/s.rfind(c)、JS・TS・Java indexOf/lastIndexOf、C# IndexOf/LastIndexOf(char を渡すと序数比較)、C++ find/rfind、C strchr/strrchr。
Craykon は s.位置検索(c) で最初の位置を得て、最後の位置は末尾から s[i] == c を調べるループで探します(後ろから探すメンバーはありません)。
見つからないときの値が言語ごとに違います:たいてい -1 ですが、Python index/rindex は ValueError を投げ、C++ find は std::string::npos(size_t の最大値 18446744073709551615)を返すので、そのまま出力すると -1 になりません。
C の strchr はポインタか NULL を返すので、先に NULL か調べてから p - s で位置を求めます。
一文字は Java・C#・C・C++ では char(一重引用符 'a')で、Python・JS・TS・Craykon には別の型がなく長さ 1 の文字列です。

Pythonmain.py · 3 行
s = input()c = input()[0]print(s.find(c), s.rfind(c))
JavaScriptmain.js · 3 行
const [s, line] = require("fs").readFileSync(0, "utf8").split("\n").map((x) => x.trim());const c = line[0];console.log(s.indexOf(c), s.lastIndexOf(c));
TypeScriptmain.ts · 4 行
import { readFileSync } from "node:fs";const [s, line]: string[] = readFileSync(0, "utf8").split("\n").map((x) => x.trim());const c: string = line[0];console.log(s.indexOf(c), s.lastIndexOf(c));
JavaMain.java · 11 行
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));        String s = br.readLine().trim();        char c = br.readLine().trim().charAt(0);        System.out.println(s.indexOf(c) + " " + s.lastIndexOf(c));    }}
C#Main.cs · 11 行
using System; class Program{    static void Main()    {        string s = Console.ReadLine().Trim();        char c = Console.ReadLine().Trim()[0];        Console.WriteLine(s.IndexOf(c) + " " + s.LastIndexOf(c));    }}
C++main.cpp · 12 行
#include <iostream>#include <string> int main() {    std::string s;    char c;    std::cin >> s >> c;    size_t first = s.find(c);    size_t last = s.rfind(c);    std::cout << (first == std::string::npos ? -1 : (long long)first) << " "              << (last == std::string::npos ? -1 : (long long)last) << "\n";}
Cmain.c · 12 行
#include <stdio.h>#include <string.h> int main(void) {    char s[1001];    char c;    if (scanf("%1000s %c", s, &c) != 2) return 0;    char *first = strchr(s, c);    char *last = strrchr(s, c);    printf("%d %d\n", first ? (int)(first - s) : -1, last ? (int)(last - s) : -1);    return 0;}
Craykonmain.cray · 13 行
s = コンソール.行読み().空白除去();c = コンソール.行読み().空白除去()[0];first = s.位置検索(c);last = -1;繰り返す (i = s.長さ - 1; i >= 0; i--){    もし (s[i] == c)    {        last = i;        抜ける;    }}コンソール.書く(first + " " + last);