首页 > 试题广场 > 脸滚键盘
[编程题]脸滚键盘
  • 热度指数:2700 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

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
5 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
测试中这个例子为什么答案是 [$],而不是[%] ?
发表于 2019-09-08 14:12:30 回复(2)
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)
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)

为什么会输出这么多Myon~ Myon~ Myon~ Myon~ Myon~ Myon~ Myon~ Myon~ Myon~ 
编辑于 2020-02-26 22:57:29 回复(0)
##                     r8i          
##            ,Br;;  iaiXW          
##             WXr7X2aZr0r          
##             ;ZSX2ii7X;;          
##            ;XXiZWXaZ:;Zr         
##             S0ZX.  ;aZS          
##            ,S27rX:,0X.S2:        
##         iXX:,X8M080@07;X7i       
##       .BZ8; rMW0Xr7BZ8BZ;:       
##        S2r:;ar:aXSZX2,  S,;ri.   
##         72;Br  W0r7a8Sa;SZ:r.i.  
##        ,i0a@W0Z80XS7ZMWr,M.r     
##          i2S  B0BMMMaZ;  S.:     
##          :2  .8a08888;;   .      
##       :i7X :X; SW020Wi ;;  ,     
##      Z0aS:XX:r WWBZWWW  .:  ;    
##      78Sr2i,X. MB@8MWB7.:    2:. 
##       Sr7BZS7 S@200@W0;.;80B;,i  
##         S2SaarM8aa2aZ82;B2,87    
##      .X;i7Xr rM@MWW8XX0XS7       
##     ,Z. ,72  @BM0@BM0;ZS r.      
##    a8. .Xa  WW@B0@Z8MaX8; 2  , 7.
##     iS:XS, XMZXWWBZZ0W;8S, 2 iZM.
##      BM20  MW2;ZW@Z2@87B2XS8022: 
##     ,7iZaSWMWBSZ2MW0MM0WWZ, ;Z   
##    :Xi22 .aa0W@WWMWZ2XaWBi   SBi 
##      i.. 8X  X7ir; ,   ,2ZSS  ,: 
##         ;a.  .r@2, .0M7 .:i      
##                M@   @Mi          
##                MMi ,MBX          
##                WMM 8MM           
##
##     紫 妹 保 佑 , 代 码 无 BUG


try:
    while True:
        s = input().strip().split(' ',1) # 输入
        n = int(s[0])
        hashTable = [] # 将字符串中存在的字符存进哈希表
        _hashTable = {} # 用于计算每个字符重复次数的哈希数组
        kind_of_char = 0 # 字符串中一共有多少种字符
        for i in s[1]:
            if i not in hashTable: # 每个字符只存一个进去,如果字符串中不止一个该字符,不存入
                hashTable.append(i)
                _hashTable[kind_of_char] = 1 # 挨个存入,与哈希表一一对应,初始值为'1'
                kind_of_char += 1
            else:
                pos = hashTable.index(i) # 定位重复值在哈希表中的位置,并使与之对应的重复次数+1
                _hashTable[pos] += 1

        order = [] # 把只出现过一次的字符合并为新的列表
        target = 0 # 共有多少只出现过一次的字符
        for k in range(kind_of_char):
            if(_hashTable[k] == 1):
                order.append(hashTable[k])
                target += 1
            
        if(target == 0): # 如果根本没有只出现过一次的字符,直接给flag赋0
            flag = 0
        for j in range(target):
            if(j == (n-1)): # 如果输入的n在只出现过一次的字符的数量之内,说明可以找到指定的值,即答
                print('['+str(order[j])+']')
                flag = 1
                break
            
            else: # 在限定范围以外,比如5 abcd,最末只出现过一次的字符为d,位置为4,不存在位置为5的符合条件的值,flag赋0
                flag = 0
        if(flag == 0):
            print("Myon~") # MyonMyonMyon!
except:
    pass

编辑于 2019-10-11 22:28:16 回复(0)
#include <algorithm>
#include <iostream>
#include <list>
#include <map>
#include <string>
using namespace std;

int main()
{
    int x;
    string s;
    while (cin >> x)
    {
        int count = 0;
        map<char, int> dic;
        list<char> ch;
        getchar();
        getline(cin, s);
        // cout << x << " xxxx: " << s << endl;
        for (auto it = s.begin(); it != s.end(); it++)
        {
            ch.push_back(*it);
            dic[*it] += 1;
        }
        ch.unique();//去掉重复元素
        for (auto it = ch.begin(); it != ch.end(); it++)
        {
            if (dic[*it] == 1)
            {
                count++;
            }
            if (count == x)
            {
                cout << "[" << *it << "]" << endl;
                break;
            }
        }
        if (count != x)
        {
            cout << "Myon~" << endl;
        }
    }
    return 0;
}


用list来记录字符顺序,用map来记录字符出现的次数,应该算是好理解的解法了,已AC。
编辑于 2019-09-26 17:50:04 回复(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)

热门推荐

通过挑战的用户

查看代码