首页 > 试题广场 >

最后一个字符

[编程题]最后一个字符
  • 热度指数:11430 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
正在挑战一个CrackMe的你,把需要填写的前面几位密码都正确猜出了,可是这最后一位密码,好像藏得有点深。CrackMe的作者还挑衅般的在里面藏了个.tar.gz文件,解压缩出来,里面写道 你要的最后一个字符就在下面这个字符串里,这个字符是下面整个字符串中第一个只出现一次的字符。(比如,串是abaccdeff,那么正确字符就是b了) 然而下面给出来的字符串好像太长太长了,单靠人力完全无法找出来。 于是,你需要写一个程序代劳了。输入文件体积较大,请使用一些快速的输入输出手段,不推荐使用cin/cout,对Java并不推荐使用Scanner直接读写。

输入描述:
第一行,一个正整数T(T≤20)  ,表示输入数据组数。
之后T行,每行一个字符串S。( 1≤S 的长度≤1000000 ,保证字符串中出现的字符的ASCII码在[0x21,0x7F)范围内,即均为可显示的非空白符,同时保证一定有解)


输出描述:
一共T 行,每行一个字符C ,表示所给的相应字符串中第一个只出现一次的字符。
示例1

输入

2
abaccdeff
testonline

输出

b
s
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

let arr = [];
void (async function () {
    // Write your code here
    let num = await readline();
    let arr = [];
    // 将输入数据存入数组
    for (let i = 0; i < num; i++) {
        let i = await readline();
        arr.push(i);
    }

    for (let i = 0; i < arr.length; i++) {
        let ot = FirstNotRepeatingChar(arr[i]);
        console.log(ot);
    }
})();

function FirstNotRepeatingChar(str) {
    // write code here
    if (str.length === 0) {
        return -1;
    }
    let map = {};
    for (let i = 0; i < str.length; i++) {
        let charX = str[i];
        if (!map[charX]) {
            map[charX] = 1;
        } else {
            map[charX]++;
        }
    }
    for (let i = 0; i < str.length; i++) {
        let charY = str[i];
        if (map[charY] == 1) {
            return str[i];
        }
    }
}

发表于 2024-10-12 17:05:50 回复(0)