小米第二题大家怎么做的?

试卷类别: 服务端开发类试卷

PS: 只过20%...

我的策略是: 有些字符, 比如Z, 只出现在ZERO中, 那么就可以唯一确定 0 (这里讨论的0 是 (index + 8)%10过后的结果 ) 了, 假设出现n个Z, 那么对应的就有n个0, 然后把n个 'Z' 'E' 'R' 'O' 字符 从输入里面删掉, 接下来就不可能出现0了!

同理:
Z -> 0
W -> 2
U -> 4
X -> 6
G -> 8

在上面这6个数字的情况都处理完毕之后, 则有:

F -> 5 (出现F的可能是4或5, 但是4已经被处理完了[所以要按顺序处理下来], 所以肯定是5, 下面类似)
H -> 3
V -> 7
O -> 1
N -> 9 [kochira] 9应该要用 E , NINE N出现了2次! 不行
E -> 9 才对

通过这种方式就可以推算出输入的字符串对应了哪些数字, 最后再反向操作 "(index +8) % 10" 就可以得到原有的数字和它的出现次数, 然后再按照字典序输出...


#小米#
全部评论
#include <iostream> #include <vector> #include <string> using namespace std; int main()  { int T; cin>>T; for(int t = 0; t < T; ++t) { string str; cin>>str; int cnt[128] = {0}; for(int i = 0; i < str.length(); ++i) ++cnt[str[i]]; int num[10] = {0}; num[0] = cnt['Z']; num[2] = cnt['W']; num[4] = cnt['U']; num[6] = cnt['X']; num[8] = cnt['G']; num[1] = cnt['O'] - num[0] - num[2] - num[4]; num[3] = cnt['H'] - num[8]; num[5] = cnt['F'] - num[4]; num[7] = cnt['V'] - num[5]; num[9] = cnt['I'] - num[5] - num[6] - num[8]; for(int i = 0, j = 8; i < 10; ++i, j = (j + 1) % 10) for(int k = 0; k < num[j]; ++k) cout<<(j + 2) % 10; cout<<endl; }     return 0; } 思路差不多
点赞 回复 分享
发布于 2016-09-23 21:07
这道题考察的是费脑子和费键盘的关系. 多想想代码就短,想少了代码就长.
点赞 回复 分享
发布于 2016-09-23 21:22
import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class Main { // NUMBER.put("FOUR", 6); // U // NUMBER.put("SIX", 8); // X // NUMBER.put("TWO", 4); // W // NUMBER.put("EIGHT", 0); // G // NUMBER.put("ZERO", 2); // Z // NUMBER.put("ONE", 3); // O // NUMBER.put("THREE", 5); // R // NUMBER.put("FIVE", 7); // F // NUMBER.put("SEVEN", 9); // S // NUMBER.put("NINE", 1); // E private static ArrayList<Integer> getSourceNumber(String number) { ArrayList<Integer> ans = new ArrayList<>(); int cnt[] = new int[26]; for (int i = 0; i < 26; i++) cnt[i] = 0; for (int i = 0, len = number.length(); i < len; i++) { cnt[number.charAt(i) - 'A']++; } // 4 while (cnt['W' - 'A']-- > 0) { cnt['T' - 'A']--; cnt['O' - 'A']--; ans.add(4); } // 6 while (cnt['U' - 'A']-- > 0) { cnt['F' - 'A']--; cnt['O' - 'A']--; cnt['R' - 'A']--; ans.add(6); } // 8 while (cnt['X' - 'A']-- > 0) { cnt['S' - 'A']--; cnt['I' - 'A']--; ans.add(8); } // 0 while (cnt['G' - 'A']-- > 0) { cnt['E' - 'A']--; cnt['I' - 'A']--; cnt['H' - 'A']--; cnt['T' - 'A']--; ans.add(0); } // 2 while (cnt['Z' - 'A']-- > 0) { cnt['E' - 'A']--; cnt['R' - 'A']--; cnt['O' - 'A']--; ans.add(2); } // 3 while (cnt['O' - 'A']-- > 0) { cnt['N' - 'A']--; cnt['E' - 'A']--; ans.add(3); } // 5 while (cnt['R' - 'A']-- > 0) { cnt['T' - 'A']--; cnt['H' - 'A']--; cnt['E' - 'A'] -= 2; ans.add(5); } // 7 while (cnt['F' - 'A']-- > 0) { cnt['I' - 'A']--; cnt['V' - 'A']--; cnt['E' - 'A']--; ans.add(7); } // 9 while (cnt['S' - 'A']-- > 0) { cnt['E' - 'A'] -= 2; cnt['V' - 'A']--; cnt['N' - 'A']--; ans.add(9); } // 1 while (cnt['I' - 'A']-- > 0) { cnt['N' - 'A'] -= 2; cnt['E' - 'A']--; ans.add(1); } return ans; } public static void main(String args[]) { Scanner cin = new Scanner(System.in); while (cin.hasNext()) { int n = cin.nextInt(); for (int i = 0; i < n; i++) { String number = cin.next(); ArrayList<Integer> ans = getSourceNumber(number); Collections.sort(ans); for (Integer item : ans) { System.out.print(item); } System.out.println(); } } } }
点赞 回复 分享
发布于 2016-09-23 21:10
package 小米.test3;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.Scanner;public class Main { public static ArrayList<String> lists = new ArrayList<String>(); public static String moveFirst(String string,String word) { char[] chars = word.toCharArray(); for(int ii=0;ii<chars.length;ii++) { int i = string.indexOf(chars[ii]); string = string.substring(0, i) + string.substring(i + 1, string.length()); } return string; } public static void cleanZERO(String string) { while (string.indexOf("Z") >= 0) { string = moveFirst(string, "ZERO"); lists.add("2"); } while (string.indexOf("G") >= 0) { string = moveFirst(string, "EIGHT"); lists.add("0"); } while (string.indexOf("H") >= 0) { string = moveFirst(string, "THREE"); lists.add("5"); } while (string.indexOf("W") >= 0) { string = moveFirst(string, "TWO"); lists.add("4"); } while (string.indexOf("R") >= 0) { string = moveFirst(string, "FOUR"); lists.add("6"); } while (string.indexOf("F") >= 0) { string = moveFirst(string, "FIVE"); lists.add("7"); }while (string.indexOf("O") >= 0) { string = moveFirst(string, "ONE"); lists.add("3"); } while (string.indexOf("V") >= 0) { string = moveFirst(string, "SEVEN"); lists.add("9"); } while (string.indexOf("S") >= 0) { string = moveFirst(string, "SIX"); lists.add("8"); } while (string.indexOf("N") >= 0) { string = moveFirst(string, "NINE"); lists.add("1"); } Collections.sort(lists); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = Integer.parseInt(sc.nextLine()); String[] str_arr = new String[n]; for(int i=0;i<n;i++) { str_arr[i] = sc.nextLine(); } for(int i=0;i<str_arr.length;i++) { cleanZERO(str_arr[i]); for(int j=0;j<lists.size();j++) { System.out.print(lists.get(j)); } System.out.println(); lists.clear(); } }}
点赞 回复 分享
发布于 2016-09-23 23:43
用一个数组记录每个节点的父节点。    然后求    每个结点到根节点的距离。只需向上找父节点就行。 如果能考虑到每个节点只有一个父节点,那么比较简单。
点赞 回复 分享
发布于 2016-09-23 22:04
var N = parseInt(read_line()); var str = ""; for(var i=0;i<N;i++){ print(fn(read_line())); } function fn(str){ var arr = str.split(""); // console.log(arr) var res = []; while(arr.indexOf("Z") != -1){ del(arr,["Z","E","R","O"]); res.push(0); } while(arr.indexOf("W") != -1){ del(arr,["T","O","W"]); //console.log(arr); res.push(2); } while(arr.indexOf("U") != -1){ del(arr,["F","O","U","R"]); res.push(4); } while(arr.indexOf("G") != -1){ del(arr,["G","E","I","H","T"]); res.push(8); } while(arr.indexOf("R") != -1){ del(arr,["T","H","R","E","E"]); res.push(3); } while(arr.indexOf("O") != -1){ del(arr,["O","N","E"]); res.push(1); } while(arr.indexOf("F") != -1){ del(arr,["F","I","V","E"]); res.push(5); } while(arr.indexOf("X") != -1){ del(arr,["S","I","X"]); res.push(6); } while(arr.indexOf("S") != -1){ del(arr,["S","E","V","E","N"]); res.push(7); } while(arr.indexOf("N") != -1){ del(arr,["N","I","N","E"]); res.push(9); } var resss = []; res.forEach(function(item){ resss.push((2+item)%10); }); return resss.sort(function(a,b){return a-b}).join(""); } // fn("OHEWTIEGTHENRTEO"); function del(arr,arrNum){ arrNum.forEach(function(item){ var _index = arr.indexOf(item); // console.log(_index); arr.splice(_index,1); }); } js  通过80%     这里要喷一下赛马网:赛马网的js输入输出 现在都搞不太懂,有时候同样的代码人多的时候就全错,人少的时候就全对       真的很郁闷,明明很简单的题,输入输出就是搞不定,,,,平时也不能看出来具体是怎么输入输出的,
点赞 回复 分享
发布于 2016-09-23 21:24
#!/usr/bin/env python # coding=utf-8 def word2num(string_c): arr = [] while len(string_c) != 0: if 'Z' in string_c: arr.append(0) string_c.remove('Z') string_c.remove('E') string_c.remove('R') string_c.remove('O') elif 'X' in string_c: arr.append(6) string_c.remove('X') string_c.remove('S') string_c.remove('I') elif 'G' in string_c: arr.append(8) string_c.remove('G') string_c.remove('E') string_c.remove('I') string_c.remove('H') string_c.remove('T') elif 'S' in string_c : arr.append(7) string_c.remove('S') string_c.remove('E') string_c.remove('E') string_c.remove('V') string_c.remove('N') elif 'V' in string_c : arr.append(5) string_c.remove('V') string_c.remove('F') string_c.remove('I') string_c.remove('E') elif 'F' in string_c : arr.append(4) string_c.remove('F') string_c.remove('O') string_c.remove('U') string_c.remove('R') elif 'R' in string_c : arr.append(3) string_c.remove('R') string_c.remove('E') string_c.remove('E') string_c.remove('T') string_c.remove('H') elif 'T' in string_c : arr.append(2) string_c.remove('T') string_c.remove('W') string_c.remove('O') elif 'O' in string_c : arr.append(1) string_c.remove('O') string_c.remove('E') string_c.remove('N') else: arr.append(9) string_c.remove('N') string_c.remove('I') string_c.remove('E') string_c.remove('N') return arr def num2true(arr): numTrue = [] for item in arr: if item == 9: numTrue.append(1) elif item == 8: numTrue.append(0) else: numTrue.append(10 + item - 8) return numTrue def num2print_min(arr): arr.sort() arr = [str(i) for i in arr] return ''.join(arr) try: while 1: n = int(input()) for i in range(n): line = input().strip() strings = line.split() string_c = list(strings[0]) nums = word2num(string_c) truenums = num2true(nums) res = num2print_min(truenums) print(res) except: pass
点赞 回复 分享
发布于 2016-09-23 21:20
思想是对的,可能你先后顺序错了,我就是这种思想A的
点赞 回复 分享
发布于 2016-09-23 21:15
你们没发觉用例3、4里面是把所有字符打乱,而不是把英文字母打乱?搞不懂题意
点赞 回复 分享
发布于 2016-09-23 21:13
看了下 lz 的想法。。其实你基本没错了。。但是没注意到实际上按一定顺序剔除后,所有数都可以唯一确定,根本没有可能性
点赞 回复 分享
发布于 2016-09-23 21:09
这题根本就是找规律。。我是觉得很没意思
点赞 回复 分享
发布于 2016-09-23 21:08
9不能用N,用E或者I就可以A了
点赞 回复 分享
发布于 2016-09-23 21:08
先把0,2,4,6,8确定了,在确定其它
点赞 回复 分享
发布于 2016-09-23 21:06
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int n = Integer.parseInt(in.nextLine()); for(int i=0;i<n;i++){ int[] arr = new int[15]; int[] results = new int[10]; String s = in.nextLine(); for(int j=0;j<s.length();j++){ switch(s.charAt(j)){ case 'E': arr[0]++; break; case 'F': arr[1]++; break; case 'H': arr[2]++; break; case 'I': arr[3]++; break; case 'N': arr[4]++; break; case 'O': arr[5]++; break; case 'R': arr[6]++; break; case 'S': arr[7]++; break; case 'T': arr[8]++; break; case 'U': arr[9]++; break; case 'V': arr[10]++; break; case 'X': arr[11]++; break; case 'Z': arr[12]++; break; case 'W': arr[13]++; break; case 'G': arr[14]++; break; } } if(arr[14]>0&&arr[0]>=arr[14]&&arr[3]>=arr[14]&&arr[2]>=arr[14]&&arr[8]>=arr[14]){ results[8]+=arr[14]; arr[0]-=arr[14]; arr[3]-=arr[14]; arr[2]-=arr[14]; arr[8]-=arr[14]; arr[14]=0; } if(arr[12]>0&&arr[0]>=arr[12]&&arr[6]>=arr[12]&&arr[5]>=arr[12]){ results[0]+=arr[12]; arr[0]-=arr[12]; arr[6]-=arr[12]; arr[5]-=arr[12]; arr[12]=0; } if(arr[11]>0&&arr[7]>=arr[11]&&arr[3]>=arr[11]){ results[6]+=arr[11]; arr[7]-=arr[11]; arr[3]-=arr[11]; arr[11]=0; } if(arr[7]>0&&arr[0]>=2*arr[7]&&arr[10]>=arr[7]&&arr[4]>=arr[7]){ results[7]+=arr[7]; arr[0]-=(2*arr[7]); arr[10]-=arr[7]; arr[4]-=arr[7]; arr[7]=0; } if(arr[10]>0&&arr[3]>=arr[10]&&arr[1]>=arr[10]&&arr[0]>=arr[10]){ results[5]+=arr[10]; arr[3]-=arr[10]; arr[1]-=arr[10]; arr[0]-=arr[10]; arr[10]=0; } if(arr[9]>0&&arr[1]>=arr[9]&&arr[5]>=arr[9]&&arr[6]>=arr[9]){ results[4]+=arr[9]; arr[1]-=arr[9]; arr[5]-=arr[9]; arr[6]-=arr[9]; arr[9]=0; } if(arr[6]>0&&arr[8]>=arr[6]&&arr[2]>=arr[6]&&arr[0]>=2*arr[6]){ results[3]+=arr[6]; arr[8]-=arr[6]; arr[2]-=arr[6]; arr[0]-=2*arr[6]; arr[6]=0; } if(arr[8]>0&&arr[13]>=arr[8]&&arr[5]>=arr[8]){ results[2]+=arr[8]; arr[13]-=arr[8]; arr[5]-=arr[8]; arr[8]=0; } if(arr[5]>0&&arr[4]>=arr[5]&&arr[0]>=arr[5]){ results[1]+=arr[5]; arr[4]-=arr[5]; arr[0]-=arr[5]; arr[5]=0; } results[9]+=arr[3]; StringBuilder builder = new StringBuilder(); int count=8; for(int a=0;a<results.length;a++){ for(int b=0;b<results[count];b++){ builder.append(a); } count=count+1>9?0:count+1; } System.out.println(builder.toString()); } } in.close(); } } 和楼主一样
点赞 回复 分享
发布于 2016-09-23 21:05
差不多,反正我dfs超时,只过20%
点赞 回复 分享
发布于 2016-09-23 21:05

相关推荐

秋招投简历提醒助手:简历内容全部去掉,黑体加粗大写北京大学
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务