首页 > 试题广场 > 脸滚键盘
[编程题]脸滚键盘

av394281 中,充满威严的蕾米莉亚大小姐因为触犯某条禁忌,被隙间妖怪八云紫(紫m……èi)按住头在键盘上滚动。
同样在弹幕里乱刷梗被紫姐姐做成罪袋的你被指派找到大小姐脸滚键盘打出的一行字中的第 `k` 个仅出现一次的字。
(
为简化问题,大小姐没有滚出 ascii 字符集以外的字)


输入描述:
每个输入都有若干行,每行的第一个数字为`k`,表示求第`k`个仅出现一次的字。然后间隔一个半角空格,之后直到行尾的所有字符表示大小姐滚出的字符串`S`。


输出描述:
输出的每一行对应输入的每一行的答案,如果无解,输出字符串`Myon~`

(请不要输出多余的空行)

为了方便评测,如果答案存在且为c,请输出[c]
示例1

输入

2 misakamikotodaisuki
3 !bakabaka~ bakabaka~ 1~2~9!
3 3.1415926535897932384626433832795028841971693993751o582097494459211451488946419191919l91919hmmhmmahhhhhhhhhh
7 www.bilibili.com/av170001
1 111

输出

[d]
[9]
[l]
[7]
Myon~

备注:
字符串S仅包含可见ascii码,长度不超过100000
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 str;
        while ((str = br.readLine()) != null) {
            String num = str.split(" ")[0];
            int k = Integer.parseInt(num);
            String s = str.substring(num.length() + 1);
            System.out.println(appearFirstK(k, s));
        }
    }

    private static String appearFirstK(int k, String s) {
        char[] chars = s.toCharArray();
        int[] hash = new int[200];
        for (char c : chars) {
            hash[c]++;
        }
        for (char c : chars) {
            if (hash[c] == 1 && k == 1) {
                return "[" + c + "]";
            } else if (hash[c] == 1) {
                k--;
            }
        }
        return "Myon~";
    }
}
发表于 2019-08-20 16:39:11 回复(0)
334 ms 4484K Python 3
try:
    while 1:
        s = input().strip().split(' ',1)
        n,l,o,r,f = int(s[0]),s[1],[],[],1
        for i in l:
            if i not in r and l.count(i)==1:
                o.append(i)
                if len(o)==n:
                    print('['+i+']')
                    f = 0
                    break
            else: r.append(i)
        if f: print("Myon~")
except:
    pass
编辑于 2019-09-10 02:10:16 回复(0)
5 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
测试中这个例子为什么答案是 [$],而不是[%] ?
发表于 2019-09-08 14:12:30 回复(1)
while(line = readline()){
    
    var e = 0;
    for(i=0;i<line.length;i++){
        if(line[i]==" "){
            e = i;
            break;
        }
    }
    if(e==1){
        var k = parseInt(line[0]);
    }else{
        var k = parseInt(line[0])*10+parseInt(line[1]);;
    }
    var t = [];
    for(i=e+1;i<line.length;i++){
        t.push(line[i]);
    }
    var temp = [];
    var count= [] ;
    for(i=0;i<t.length;i++){
        if(temp.indexOf(t[i])==-1){
            var l =0;
            temp.push(t[i]);
            count.push(l++);
        }else{
            var index = temp.indexOf(t[i]);
            count[index]++;
        }
    }
    var w = [];
  
    for(i=0;i<count.length;i++){
        count[i]+1;
        if(count[i]==0){
            w.push(temp[i]);
        }
 
      }
    var pp = 'Myon~';
    if(w.length>=k){
           console.log('['+w[k-1]+']');
    }else{
              console.log(pp);
        }
}

编辑于 2019-09-02 15:39:49 回复(0)
不懂这个结束运行怎么结束,写成while true提示数组越界
发表于 2019-08-20 11:37:28 回复(2)
AC了哦 Myon~
#include<bits/stdc++.h>
using namespace std;


int main(){
    int n;
    string s0;
    string res;
    int cnt;
    unordered_map<char, int> m;
    
    while(getline(cin, s0)){
        // 处理输入
        int i = 0;
        while (s0[i] != ' '){
            i++;
        }
        string sn = s0.substr(0, i);
        n = stoi(sn);
        string s = s0.substr(i+1,s0.length());

        // 初始化
        res = "";
        m.clear();
        cnt = 0;

        // 核心代码
        for(int i = 0; i < s.length(); i++){
            m[s[i]]++;
        }
        for(int i = 0; i < s.length(); i++){
            if(m[s[i]] == 1){
                cnt++;
                if(cnt == n){
                    res = s[i];
                    break;
                }
            }
        }
        
        // 输出
        if(res == ""){
            cout << "Myon~" << endl;
        }else{
            cout << "[" << res << "]" << endl;
        }
    }

    return 0;
}


发表于 2019-08-19 10:15:07 回复(0)
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		while (input.hasNext()) {
			int k = input.nextInt();
			String s = input.nextLine();
			Map<String, Integer> old = new LinkedHashMap<>(); // 出现过的字
			for (int i = 0; i < s.length(); i++) {
				if (!old.containsKey(s.substring(i, i + 1))) {
					old.put(s.substring(i, i + 1), 0);
				}
			}
			Set<String> keys = old.keySet();
			for (String str : keys) {
				for (int i = 0; i < s.length(); i++) {
					if (str.equals(s.substring(i, i + 1))) {
						int value = old.get(str);
						value++;
						old.put(str, value);				
					}
				}
			}
			int count = 0;
			for(String str:keys) {
				if(old.get(str)==1&&!str.equalsIgnoreCase(" ")) {
					count++;
				}
				if(count==k) {
					System.out.println("["+str+"]");
					break;
				}
			} 
			if(count<k||k<=0) System.out.println("Myon~");
		}
	}
} 
通过率为73%…………求解!
发表于 2019-09-10 01:53:56 回复(0)
import sys
class Solution():
     def kthNumber(self):
        # 读入数据
        while True:
            try:
                tmp = []
                # n, k = list(map(int, input().split()))
                line = sys.stdin.readline().strip()
                # print('line',line)
                if line == '':
                    break
                else:
                    tmp.append(line)
                # print(tmp)
                hashTable = {}  # 创建一个哈希表用来将字符映射为一个数字
                #对tmp中的每一个字符串进行处理
                for i in range(len(tmp)):
                    string = tmp[i]
                    for i in range(len(string)):
                        if string[i] == ' ':
                            break
                    k = int(string[0:i])
                    char = string[i + 1:]
                    # print('k',k)
                    # print('char',char)
                    if char == None or len(char) <= 0:
                        return -1
                    #对字符串进行计数
                    for i in char:
                        if i in hashTable:
                            hashTable[i] += 1
                        else:
                            hashTable[i] = 1
                    # print('hash',hashTable)
                    # 在哈希表中寻找alist中出现第k个仅出现一次的字符
                    count = 0
                    #用来计数仅出现一次的字符的个数
                    for index, i in enumerate(char):
                        # print(index)
                        if hashTable[i] == 1:
                            count += 1
                            if count == k:
                                print('[' + i + ']')
                    if count < k:
                        print("Myon~")
            except:
                break
if __name__ == '__main__':
    Solution().kthNumber()

发表于 2019-08-20 16:08:52 回复(0)
importjava.util.*;
publicclassMain{
    publicstaticvoidmain(String args[]){
        Scanner scan = newScanner(System.in);
        while(scan.hasNext()){
            String s = scan.nextLine();
            if(s.equals(""))break;
            intn = Integer.parseInt(s.split("\\s+")[0]);
            Integer array[] = newInteger[128];
            for(inti = 0; i<array.length; i++) {
                array[i] = 0;
            }
            intindex = 1;
            System.out.println(find(array, index, s.substring(s.split("\\s+")[0].length()+1),n));
        }
    }
    publicstaticString find(Integer []a, intindex, String s, intn){
        Integer m[] = newInteger[128];
        for(inti = 0; i<m.length; i++) {
            m[i] = i;
        }
        for(inti = 0; i<s.length(); i++){
            if(a[s.charAt(i)]==0)
                a[s.charAt(i)] = index++;
            else
                a[s.charAt(i)] = -1;
        }
        bubblingSort(a, m);
        charc = 0;
        intnn = 0;
        for(inti = 0; i<a.length; i++) {
            if(a[i]==-1||a[i]==0)
                continue;
            else{
                nn++;
            }
            if(nn==n) {
                intt = m[i];
                c = (char) t;
                break;
            }
        }
        if(nn==n)
            return"["+String.valueOf(c)+"]";
        return"Myon~";
    }
    publicstaticvoidbubblingSort(Integer []t, Integer m[]){
        for(inti = 0; i<t.length; i++) {
            for(intj = 0; j<t.length-1; j++) {
                if(t[j].compareTo(t[j+1])>0) {
                    inttt = t[j];
                    t[j] = t[j+1];
                    t[j+1] = tt;
                    tt = m[j];
                    m[j] = m[j+1];
                    m[j+1] = tt;
                }
            }
        }
    }
}
发表于 2019-08-20 16:04:07 回复(0)
java的循环输入真的坑
终于ac
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        ArrayList<String > strings = new ArrayList<>();
        int N=0;
        String s=null;

        while(scanner.hasNextLine()){
            s = scanner.nextLine();
            if (s.equals(""))break;
            String s1 = s.split("\\s")[0];
            N = Integer.parseInt(s1);
            strings.add(基数排序(N, s.substring(s1.length()+1)));
        }

        strings.forEach(s1 -> {
            if(s1.equals("Myon~")) System.out.println("Myon~");
            else System.out.println("["+s1+"]");
        });

    }

    private static String 基数排序(int n, String s) {
        int[] arr=new int[128];
        int count=0;
        for (int i = 0; i < s.length(); i++) {
            arr[s.charAt(i)]++;
        }
        for (int i = 0; i < s.length(); i++) {
            if (arr[s.charAt(i)]==1){
                count++;
                if (count==n) return String.valueOf(s.charAt(i));
            }
        }
        if (count<n||n<=0) return "Myon~";
        else return null;
    }
}

发表于 2019-08-20 13:29:59 回复(0)
import re
import sys
 
try:
    while True:
        row = sys.stdin.readline().strip()
        r = re.match('(\d+) (.*)', row)
        n = int(r.group(1))
        str1 = r.group(2)
        c = 0
        processed = []
        for i in range(len(str1)):
            s = str1[i]
            if s in processed:
                continue
            processed.append(s)
            nums = len(str1.split(s))
            if nums == 2:
                c += 1
                if c == n:
                    print('['+s+']')
                    break
        if c != n:
            print('Myon~')
except:
    pass

发表于 2019-08-20 10:37:34 回复(0)
 我犯了2个错误
 1.读取处理字符串一开始我在用split,但是发现空格不止一处
 2.计数出现一次次数的时候,应该一发现就加1,我没想清楚
  

  var lines
  while(lines=readline()){

    var index = lines.indexOf(' ')
    var k = parseInt(lines.slice(0,index))
    var str = lines.slice(index+1)

    var map = new Map()
    for (let i = 0; i < str.length;++i){
      if(map.has(str[i])){
        // let tmp = map.get(str[i])
        map.set(str[i],map.get(str[i])+1)
      }else{
        map.set(str[i],1)
      }
      // console.log(typeof str[i],str[i])
    }

    let num = 0
    map.forEach((value, key)=>{
      //console.log(value,key)
      if(value===1){
        num++
        if(num===k){
          console.log(`[${key}]`)
        }
      }
    })
    if(num<k)
      console.log('Myon~')
  }

发表于 2019-08-20 09:24:24 回复(0)
import sys
from collections import Counter
for line in sys.stdin:
    line=line.strip('\n')
    i=0
    while line[i]!=' ':
        i+=1
    K = int(line[:i])
    strs = line[i+1:]
    counter = Counter(strs)
    ones = [k for k, v in counter.items() if v == 1]
    if len(ones) < K:
        print('Myon~')
    else:
        ones_i = []
        for k in ones:
            ones_i.append(strs.find(k))
        ones_i = sorted(ones_i)
        print('[{}]'.format(strs[ones_i[K - 1]]))
发表于 2019-08-20 00:45:34 回复(0)
思路
①定义list数组,用来记录字符串中每个字母的出现次数,初始化为0
遍历整个字符串,用记录字符串中每个字符的出现次数
③遍历数组,找到正确答案


while(lines=readline())
{
    //var lines="2 misakamikotodaisuki";
    var index=lines.indexOf(" ");
    var k=parseInt(lines.slice(0,index));
    var s=lines.slice(index+1,lines.length);
    //console.log(s);
    abc(k,s);
}
function abc(k,s)
{
   //定义list数组,并初始化为0
    var list=new Array();
    for(var i=0;i<s.length;i++)
    {
        list[s[i]]=0;
    }
   //遍历整个字符串,用记录字符串中每个字符的出现次数
    for(var i=0;i<s.length;i++)
    {
        list[s[i]]++;
    }
    var num=0;//判断只出现一次的字母的个数
    var flag=0;//判断是否有符合要求的字母,默认没有
    for(var i=0;i<s.length;i++)
    {
        if(list[s[i]]==1)
        {
            num++;
        }
        if(num==k)
        {
            console.log("["+s[i]+"]");
            flag=1;
            break;
        }
    }
    if(flag==0)
    {
        console.log("Myon~");
    }
}
发表于 2019-08-19 23:08:13 回复(0)
public class Main {
    
    public static void serachK(int n,String str){
        HashMap<Character,Integer> map = new LinkedHashMap<Character,Integer>();
        char[] temp = str.toCharArray();
        
        for(int i=0;i<temp.length;i++){
            if(map.containsKey(temp[i])){
                map.replace(temp[i],map.get(temp[i]), map.get(temp[i])+1);
            } else {
                map.put(temp[i],1);
            }
        }
//            System.out.println(map);
            int falg = 0;
            for(Entry<Character, Integer> entry:map.entrySet()){
                
                if(entry.getValue()==1)
                    falg++;
                if(falg==n){
                    System.out.println("["+entry.getKey()+"]");
                    break;
                }
            }
        
            if(falg<n){
                System.out.print("Myon~");
            }
        
    }
    public static void main(String[] args) {
    
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            String str = in.nextLine();
            int n = Integer.parseInt(str.substring(0, 1));
            serachK(n,str.substring(2));
        }
    }
}
发表于 2019-08-19 21:09:02 回复(0)
import java.util.LinkedList;
import java.util.HashSet;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        String data = "";
        while (reader.hasNext()) {
            data = reader.nextLine();
            String[] params = data.split(" ", 2);
            Fun(Integer.parseInt(params[0]), params[1]);
        }
    }
    //找到str中第n个只出现一次的字符
    public static void Fun(int n, String str) {
        //保存只出现一次元素的序列
        LinkedList<Character> list = new LinkedList<>();
        //HashSet用来查重
        HashSet<Character> set = new HashSet<>();
        for (int i = 0; i < str.length(); i++) {
            Character c = str.charAt(i);
            if (set.contains(c)) {
                list.remove(c);
            } else {
                set.add(c);
                list.add(c);
            }
        }
        if (n > list.size()) {
            System.out.println("Myon~");
        } else {
            System.out.println("[" + list.get(n - 1) + "]");
        }
    }
}

发表于 2019-08-19 13:51:44 回复(0)
 package main import ( "bufio"  "fmt"  "os"  "strconv"  "strings" ) func main() {
   scanner := bufio.NewScanner(os.Stdin)
   ss:=strings.Split(scanner.Text(),"\n") for i:=0;i<len(ss) ;i++  {
      str:=strings.Split(ss[i]," ")
      m:=make(map[rune]int)
      in,_:=strconv.Atoi(str[0]) for _,ch:=range str[1]{
         m[ch]++
      }
      aa:=make([]byte,1024)
      tt:=0  for i:=0;i<len(str[1]);i++ {
         ch:=str[1][i] if (m[int32(ch)]==1){
            aa[tt]=ch
            tt++
         }
      } if len(aa)<in {
         fmt.Println("Myon~")
      }else {
         fmt.Printf("[%c]\n",aa[in-1])
      }
   }
}
go写的,输入处理有点问题,后面的处理过程应该没啥问题,单个样例能过
发表于 2019-08-18 15:32:37 回复(1)
这道题目的数据读取有很大问题,思路就是用哈希表存储并记录字符出现的次数。然后遍历字符串,与哈希表中出现一次的字符做统计,统计到k时输出就行。数据读取很重要,不然的话AC率超低!
import sys
def kAndsInput(Tmp):
    for i in range(len(Tmp)):
        if Tmp[i] == ' ':
            break
    k = int(Tmp[0:i])
    s = Tmp[i+1:]
    return k, s
def select_kth(s,k):
    if not s:
        return 'Myon~'
    dic = {}
    for i in s:
        dic[i] = dic.get(i,0)+1
    l = 0
    while l<len(s):
        if dic[s[l]]==1:
            k -= 1
            if k==0:
                return '['+s[l]+']'
        l += 1
    return 'Myon~'
if __name__=='__main__':
    Tmp = []
    try:
        while True:
            line = sys.stdin.readline().strip()
            if line == '':
                break
            Tmp.append(line)
    except:
        pass
    for i in range(len(Tmp)):
        k,string = kAndsInput(Tmp[i])
        print(select_kth(string,k))


发表于 2019-08-18 11:27:34 回复(1)
import sys

result = []

for line in sys.stdin:
    if line[0] is '\n':
        break
    s = line
    num = int(s.split()[0])
    string = s.lstrip(s.split()[0])
# 字符串中可能出现了空格
    string = string.lstrip(" ")

    dist = {}

    for i in string:
        if i not in dist:
            dist[i] = 1
        else:
            dist[i] += 1
#并且删掉换行字符
    dist.pop('\n')

    single = list()
    for i in dist.keys():
        if dist[i] == 1:
            single.append(i)
    if len(single) == 0:
        result.append('Myon~')
    elif num > len(single):
        result.append("Myon~")
    else:
        result.append('[' + single[num - 1] + ']')

for i in result:
    print(i)
正确率仅为33%
编辑于 2019-08-18 09:35:25 回复(0)
因为限制了ASCII的字符集,所以可以方便地利用hash表实现O(1)时间的查找。对于每一行输入,得到k和字符串s。第一遍扫描s,建立hash表,如果该字符仅被访问一次,那么hash表对应的位置值为1。第二遍扫描s,就可以得到结果了。这题最头疼的是输入的处理,有哪位大佬看看我这个处理有什么问题?通过的输入处理方式借用@Je t'aime的方法。
通过的代码:
import sys
import re
input_strs = []
for s in sys.stdin:
	input_strs.append(s.strip())
# 计算部分, 输入包含多行, 每行单独计算第k个仅出现一次的字符.
for line in input_strs:
	r = re.match('(\d+) (.*)', line)
	if r:
		k = int(r.group(1))
		line_str = r.group(2)
	else:
		continue
	hash_table = [0 for _ in range(128)]
	for i in range(len(line_str)):
		hash_table[ord(line_str[i])] += 1
	# 第二次扫描字符串, 搜索第k个仅出现一次的字符.
	count = 0
	for i in range(len(line_str)):
		if hash_table[ord(line_str[i])] == 1:
			count += 1
		if count == k:
			print('[' + line_str[i] + ']')
			break
	if count < k:
		print('Myon~')
只能通过46.7%的方法:
# 输入处理
import sys
import re
input_strs = []
for s in sys.stdin:
	input_strs.append(s.strip())
# 计算部分, 输入包含多行, 每行单独计算第k个仅出现一次的字符.
for line in input_strs:
	# k指输入中的k
	k = 0
	# 需要检测的字符串
	line_str = ""
	for i in range(len(line)):
		if line[i] >= '0' and line[i] <= '9':
			k += k * 10 + int(line[i])
		else:
			if line[i] != ' ':
				print("problem.")
			line_str = line[i + 1:]
			break
	# 第一次扫描字符串, 建立hash索引.
	hash_table = [0 for _ in range(128)]
	for i in range(len(line_str)):
		hash_table[ord(line_str[i])] += 1
	# 第二次扫描字符串, 搜索第k个仅出现一次的字符.
	count = 0
	for i in range(len(line_str)):
		if hash_table[ord(line_str[i])] == 1:
			count += 1
		if count == k:
			print('[' + line_str[i] + ']')
			break
	if count < k:
		print('Myon~')


发表于 2019-08-09 16:05:04 回复(1)

热门推荐

通过挑战的用户

查看代码