首页 > 试题广场 >

脸滚键盘

[编程题]脸滚键盘
  • 热度指数:4720 时间限制: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
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 回复(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)
5 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
测试中这个例子为什么答案是 [$],而不是[%] ?
发表于 2019-09-08 14:12:30 回复(3)
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)
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 回复(1)
不懂这个结束运行怎么结束,写成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.*;

public class Main {
public static String indexOfFirstK(String s, int k){
StringBuffer sb =new StringBuffer();
for(int i=0;i<s.length();i++){
for(int j=0;j<s.length();j++){
if(i==j){
continue;
}
if(s.charAt(i)==s.charAt(j)){
break;
}
if(j==s.length()-1){
sb.append(s.charAt(i));
}
}
}
try{
return "["+sb.charAt(k-1)+"]";
}catch(StringIndexOutOfBoundsException e){
}
return "Myon~";
}

public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String s = scanner.nextLine();
int k = Integer.parseInt(s.split(" ")[0]);

s = s.substring(s.split(" ")[0].length() + 1);
System.out.println(indexOfFirstK(s, k));
}
}
}
通过率93% QAQ
发表于 2024-05-25 12:48:55 回复(0)
这个题目代码都比较好写,输入一定要非常注意!!!
因为num是一个数字,是占多个字符的,所以后面截取的时候一定要小心。
直接用substring(2)就G了。
发表于 2022-03-04 12:37:08 回复(0)
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include<string>
using namespace std;


string str;
int n[128];

int main()
{
   while(getline(cin,str))
   {
       memset(n,0,sizeof(n));
       int z=0;
       while(str[z]!=' ')
       {
           z++;
       }
       string s0=str.substr(0,z);
       string s1=str.substr(z+1,str.length());
      int k=stoi(s0);


      for(int i=0;i<s1.length();i++)
      {
          n[s1[i]]++;
      }
      int h=0;
      int flag=0;

      for(int i=0;i<s1.length();i++)
      {
          if(n[s1[i]]==1)
          {
              h++;
              if(h==k)
              {
                  cout<<'['<<s1[i]<<']'<<endl;
                  break;
              }

          }
          flag++;
      }
      if(flag==s1.length())
      {cout<<"Myon~"<<endl;}

     str="";
   }
}

发表于 2021-02-05 16:34:11 回复(0)
注意数据处理。数字和字符串之间居然有多个空格。
发表于 2021-01-27 18:37:47 回复(0)
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"strconv"
	"strings"
)

func findString(a int,s string) string{
	length := len(s)
	res := ""
	saveString := make(map[string]bool)

	for k:=0; k<length; k++{
		saveString[string(s[k])] = true
		for i := 0 ;i < length ;i++{
			if k!=i && s[k] == s[i]{
				saveString[string(s[k])] = false
				break
			}
		}
		if saveString[string(s[k])] == true{
			res = res + string(s[k])
		}
	}
	l2 := len(res)
	if a > l2{
		return "Myon~"
	}else{
		b := "["+string(res[a-1])+"]"
		return b
	}
}

func main(){
	reader := bufio.NewReader(os.Stdin)
	for {
		text, err := reader.ReadString('\n')
		text = strings.TrimSpace(text)

		if err == io.EOF{
			break
		}
		s1 := strings.SplitN(text," ",2)
		if len(s1)<2{
			continue
		}
		target,_ := strconv.Atoi(s1[0])
		s := s1[1]
		a := findString(target,s)
		fmt.Println(a)
	}

}

发表于 2020-08-12 23:40:45 回复(0)
#include<iostream>
using namespace std;
#include<cstring>
int main(){
	int cntx[129];
	bool v[129];
	string st;
	int k;
	bool flag;
	char ans;
	while(cin>>k){
		cin.ignore();
		int cnt=0;
		flag=0;
		memset(cntx,0,sizeof(cntx));
		memset(v,0,sizeof(v));
		getline(cin,st);
		for(int i=0;i<st.length();i++){
			cntx[st[i]]++;
		}
		for(int i=0;i<st.length();i++){
			if(v[st[i]]==0&&cntx[st[i]]==1){
				v[st[i]]=1;
				ans=st[i];
				cnt++;
			}
			if(cnt==k){
				flag=1;
				cout<<"["<<ans<<"]"<<endl;
				break;
			}
			
		}
		if(flag==0) cout<<"Myon~\n";
	}
}

发表于 2020-06-26 00:53:37 回复(0)
while 1:
    try:
        a = input().strip()
        k = int(a[0])
        s = a[2:]
        one = []
        visited = []
        for i in s:
            if i not in one:
                if i not in visited:
                    one.append(i)
            else:
                one.remove(i)
                visited.append(i)
        try:
            #print(one)
            out = '[' + one[k-1] + ']'
            print(out)
        except:
            print('Myon~')
    except:
        break

代码如上,测试可以通过,运行只能通过13%,那位大佬可以帮我看一下问题在哪,谢谢
发表于 2020-05-27 16:27:48 回复(0)
思路:两次遍历,第一次遍历通过hash 表统计各个字符出现的次数,第二次遍历,结合hash表计算出第`k`个出现一次的字符。代码如下:
#include <iostream>
#include <string>
#include <sstream>
#include <map>


#define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

using namespace std;

int main()
{
    INIT();
    string line;
    while(getline(cin,line))
    {
        stringstream istr(line);
        int k = 0;
        string str;
        istr >> k;
                // 读取空格
        istr.get();
                // 读个到行行尾的所有字符,切忌使用cin,cin遇到空格符结束,
                // 导致无法读到行尾
        getline(istr, str);
        int counter[256] = {0};
        for(int i = 0; i < str.size(); i++)
            counter[str[i]]++;
        int j = 0;
        for(int i = 0; i < str.size(); i++)
        {
            if(counter[str[i]] == 1)
            {
                j++;
                if(j == k)
                {
                    cout << "[" << str[i] << "]" << endl;
                    break;
                }
            }    
        }
        if(j != k) cout << "Myon~" << endl;
    }
    return 0;
}


编辑于 2020-04-19 22:15:12 回复(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)