java号码分身_电话号码分身

本文介绍了一种将特定格式的英文数字字符串解码为实际数字的算法实现,通过识别每个数字特有的字符并统计其出现次数,进而推算出每个数字出现的频率。文章提供了多种编程语言的实现方案,包括Java、Python和C++等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0

import java.util.ArrayList;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int number = sc.nextInt();

for (int i = 0; i < number; i++) {

String fenshen = sc.next();

result(fenshen);

}

}

private static void result(String fenshen) {

int [] sa = {0,0,0,0,0,0,0,0,0,0};

char [] arr_num = fenshen.toCharArray();

ArrayList numArray = new ArrayList();

numArray.clear();

for (char j :arr_num)

{

numArray.add(String.valueOf(j));

}

while (numArray.remove("Z")) {

sa[0] ++;

numArray.remove("O");

}

while (numArray.remove("W")) {

sa[2] ++;

numArray.remove("O");

}

while (numArray.remove("U")) {

sa[4] ++;

numArray.remove("O");

numArray.remove("F");

}

while (numArray.remove("X")) {

sa[6] ++;

numArray.remove("S");

numArray.remove("I");

}

while (numArray.remove("G")) {

sa[8]++;

numArray.remove("H");

numArray.remove("I");

}

while (numArray.remove("H")) {

sa[3] ++;

}

while (numArray.remove("F")) {

sa[5] ++;

numArray.remove("I");

}

while (numArray.remove("S")) {

sa[7] ++;

}

while (numArray.remove("O")) {

sa[1] ++;

}

while (numArray.remove("I")) {

sa[9] ++;

}

for(int k=8;k<18;k++)

{

int a;

if (k>9) a=k-10;

else

a=k;

if (sa[a]>0) {

if (a < 8)

for (int j=0;j

System.out.print(a + 2);

}

else

for (int j=0;j

System.out.print(a - 8);

}

}

}

System.out.println();

}

}

编辑于 2017-08-13 03:32:51

回复(0)

更多回答

56

要先依次解码具有独一无二字符的数字,具有这样特点的数字有五个分别是FOUR(U),SIX(X),

TWO(W),EIGHT(G),ZERO(Z),可以根据独特字符的个数直接判断有多少个相应的数字,例如有

3个U那么就一定有3个FOUR...,解码完成这五个数字之后另外的数字也会由于这些数字的移除

而具有了独一无二的字符,这样的数字有FIVE(F),THREE(T),FIVE找到之后,只有SEVEN含

有V,所以又可以依据V字符的个数解码SEVEN的个数,最后剩下的ONE和NINE也具有了自己的

标志性字符分别是ONE(O),NINE(I),需要注意的是原始数字和最终出现的数字还有一个转换

的过程(加8取个位数),所以还要相应转换回去。最后要注意的是,要求每行字符串对应的

分身前的最小电话号码,不要傻傻的按照字典序排序,这样时间复杂度过高,对于这个问题

可以用桶排序,10个bucket分别用于统计0-9出现的次数,最终桶中存储的结果依次输出就是

所有组合中最小的数字。

#include

#include

#include

#include

using namespace std;

int main(){

int i = 0, j = 0;

int n;

while (cin >> n){

string s;

for (i = 0; i < n; i++){

cin >> s;

vector iimap(256);

for (j = 0; j < s.size(); j++){

iimap[s[j]]++;

}

vector res(10);

int count = iimap['U'];

res[6] = count;

iimap['F'] -= count;

iimap['O'] -= count;

iimap['U'] -= count;

iimap['R'] -= count;

count = iimap['X'];

res[8] = count;

iimap['S'] -= count;

iimap['I'] -= count;

iimap['X'] -= count;

count = iimap['W'];

res[4] = count;

iimap['T'] -= count;

iimap['W'] -= count;

iimap['O'] -= count;

count = iimap['G'];

res[0] = count;

iimap['E'] -= count;

iimap['I'] -= count;

iimap['G'] -= count;

iimap['H'] -= count;

iimap['T'] -= count;

count = iimap['Z'];

res[2] = count;

iimap['Z'] -= count;

iimap['E'] -= count;

iimap['R'] -= count;

iimap['O'] -= count;

count = iimap['F'];

res[7] = count;

iimap['F'] -= count;

iimap['I'] -= count;

iimap['V'] -= count;

iimap['E'] -= count;

count = iimap['V'];

res[9] = count;

iimap['S'] -= count;

iimap['E'] -= count;

iimap['V'] -= count;

iimap['E'] -= count;

iimap['N'] -= count;

count = iimap['T'];

res[5] = count;

iimap['T'] -= count;

iimap['H'] -= count;

iimap['R'] -= count;

iimap['E'] -= count;

iimap['E'] -= count;

count = iimap['O'];

res[3] = count;

iimap['O'] -= count;

iimap['N'] -= count;

iimap['E'] -= count;

count = iimap['I'];

res[1] = count;

iimap['N'] -= count;

iimap['I'] -= count;

iimap['N'] -= count;

iimap['E'] -= count;

for (int k = 0; k < res.size(); k++){

for (int l = 0; l < res[k]; l++)

cout << k;

}

cout << endl;

}

}

return 0;

}

编辑于 2017-08-24 15:49:06

回复(18)

17

握草,这逼题

import java.util.Scanner;

/**

* Created by Evergreen on 2017/8/10.

*/

public class Main {

public static void handle(String str){

str=str.toLowerCase();

int[] hash=new int[10];

StringBuffer sb=new StringBuffer(str);

while(sb.toString().contains("z")){//zero

//2

hash[2]++;

sb.deleteCharAt(sb.indexOf("z"));

sb.deleteCharAt(sb.indexOf("e"));

sb.deleteCharAt(sb.indexOf("r"));

sb.deleteCharAt(sb.indexOf("o"));

}

while(sb.toString().contains("x")){//six

hash[8]++;

sb.deleteCharAt(sb.indexOf("s"));

sb.deleteCharAt(sb.indexOf("i"));

sb.deleteCharAt(sb.indexOf("x"));

}

while(sb.toString().contains("s")){//seven

hash[9]++;

sb.deleteCharAt(sb.indexOf("s"));

sb.deleteCharAt(sb.indexOf("e"));

sb.deleteCharAt(sb.indexOf("v"));

sb.deleteCharAt(sb.indexOf("e"));

sb.deleteCharAt(sb.indexOf("n"));

}

while(sb.toString().contains("u")){//four

hash[6]++;

sb.deleteCharAt(sb.indexOf("f"));

sb.deleteCharAt(sb.indexOf("o"));

sb.deleteCharAt(sb.indexOf("u"));

sb.deleteCharAt(sb.indexOf("r"));

}

while(sb.toString().contains("f")){//five

hash[7]++;

sb.deleteCharAt(sb.indexOf("f"));

sb.deleteCharAt(sb.indexOf("i"));

sb.deleteCharAt(sb.indexOf("v"));

sb.deleteCharAt(sb.indexOf("e"));

}

while(sb.toString().contains("g")){//eight

hash[0]++;

sb.deleteCharAt(sb.indexOf("e"));

sb.deleteCharAt(sb.indexOf("i"));

sb.deleteCharAt(sb.indexOf("g"));

sb.deleteCharAt(sb.indexOf("h"));

sb.deleteCharAt(sb.indexOf("t"));

}

while(sb.toString().contains("w")){//two

hash[4]++;

sb.deleteCharAt(sb.indexOf("t"));

sb.deleteCharAt(sb.indexOf("w"));

sb.deleteCharAt(sb.indexOf("o"));

}

while(sb.toString().contains("h")&&!sb.toString().contains("g")){//three

hash[5]++;

sb.deleteCharAt(sb.indexOf("t"));

sb.deleteCharAt(sb.indexOf("h"));

sb.deleteCharAt(sb.indexOf("r"));

sb.deleteCharAt(sb.indexOf("e"));

sb.deleteCharAt(sb.indexOf("e"));

}

while(sb.toString().contains("o")&&!sb.toString().contains("z")){//one

hash[3]++;

sb.deleteCharAt(sb.indexOf("o"));

sb.deleteCharAt(sb.indexOf("n"));

sb.deleteCharAt(sb.indexOf("e"));

}

while(sb.toString().contains("n")) {//nine

hash[1]++;

sb.deleteCharAt(sb.indexOf("n"));

sb.deleteCharAt(sb.indexOf("i"));

sb.deleteCharAt(sb.indexOf("n"));

sb.deleteCharAt(sb.indexOf("e"));

}

for(int i=0;i<10;i++){

for(int j=1;j<=hash[i];j++){

System.out.print(i);

}

}

System.out.println();

}

public static void main(String[] args) {

Scanner sc=new Scanner(System.in);

while(sc.hasNextInt()){

int n=sc.nextInt();

for(int i=0;i

handle(sc.next());

}

}

}

发表于 2017-08-10 14:23:11

回复(18)

16

这道题目是leetcode上的。小米抄袭过来稍加改造了一下,不过还是换汤不换药。

python解法献上: import sys

def originalDigits(s):

result = [0] * 10

result[0] = s.count("Z")

result[2] = s.count("W")

result[4] = s.count("U")

result[6] = s.count("X")

result[7] = s.count("S") - result[6]

result[5] = s.count("V") - result[7]

result[1] = s.count("O") - result[0] - result[4] - result[2]

result[9] = (s.count("N") - result[1] - result[7]) // 2

result[8] = s.count("I") - result[5] - result[6] - result[9]

result[3] = s.count("H") - result[8]

t, resStr = "", ""

for i, r in enumerate(result):

t += r * str(i)

for i in t:

if int(i) >= 8:

resStr += str(int(i) - 8)

else:

resStr += str(int(i) + 10 - 8)

return "".join(sorted(resStr))

for i in sys.stdin.readlines():

if i[0].isalpha():

print(originalDigits(i.strip()))

编辑于 2017-09-07 14:14:01

回复(7)

10

/*

Z:0; W:2;

U:4; X:6;

G:8; O:0, 1, 2, 4;

R:0, 3, 4; F:4, 5;

S:6, 7; I:5, 6, 8, 9

字母-代表数字-加8前表示数字

G-8-0, I-9-1, Z-0-2, O-1-3, W-2-4, R-3-5, U-4-6, F-5-7, X-6-8, S-7-9

*/

#include

using namespace std;

int main(){

int T;

char mas[10] = {'G', 'I', 'Z', 'O', 'W', 'R', 'U', 'F', 'X', 'S'};

while(cin >> T){

for(int i = 0; i < T; i ++){

string tel;

cin >> tel;

int count[10] ={0};

for(int j = 0; j < tel.length(); j++){

for(int z = 0; z < 10; z++){

if(tel[j] == mas[z]) count[z]++;

}

}

count[3] = count[3] - count[2] - count[4] - count[6];

count[5] = count[5] - count[2] - count[6];

count[7] = count[7] - count[6];

count[9] = count[9] - count[8];

count[1] = count[1] - count[7] - count[8] - count[0];

for(int i = 0; i < 10; i++){

for(int j = 0; j < count[i]; j++){

cout << i;

}

}

cout << endl;

}

}

return 0;

}

发表于 2017-08-31 10:43:01

回复(4)

6

思路基本是一楼的思路 但是他的代码太长了

实际上0 2 4 6 8这几个数字可以通过Z W U X G唯一确定

剩下的1 3 5 7可以通过O T F S唯一确定

而剩下的9随便哪个都可以确定 姑且用I

将这些按顺序写成一个表

这些都可以打表来简化代码 代码如下

#include

#include

#include

#include

#include

using namespace std;

string a[10] = {"ZERO", "TWO", "FOUR", "SIX", "EIGHT",

"ONE", "THREE", "FIVE", "SEVEN",

"NINE"};

int num_map[] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9};

char dic[] = {'Z', 'W', 'U', 'X', 'G', 'O', 'T', 'F', 'S', 'I'};

int ha[26];

vector ans;

int main(){

int T; scanf("%d", &T);

while(T--){

string s; cin>>s;

ans.clear();

memset(ha, 0, sizeof(ha));

for(int i = 0; i < s.length(); i++) ha[s[i]-'A']++;

for(int i = 0; i < 10; i++){

int times = ha[dic[i]-'A'];

if(times > 0){

for(int j = 0; j < a[i].size(); j++)

ha[a[i][j]-'A'] -= times;

for(int k = times; k > 0; k--)

ans.push_back((num_map[i]+2) % 10);

}

}

sort(ans.begin(), ans.end());

for(int i=0;i

printf("\n");

}

}

编辑于 2018-10-03 20:00:55

回复(3)

5

#include

#include

#include

#include

using namespace std;

int main()

{

int T;

while(cin>>T)

{

string input;

while(T--)

{

cin>>input;

map help;

for(auto& t:input)

{

help[t]+=1;

}

vector count(10);

count[0]=help['Z'];            //ZERO

count[2]=help['W'];            //TWO

count[4]=help['U'];            //FOUR

count[1]=help['O']-count[0]-count[2]-count[4];     //ONE

count[6]=help['X'];            //SIX

count[8]=help['G'];            //EIGHT

count[3]=help['T']-count[2]-count[8];        //TRHEE

count[5]=help['F']-count[4];            //FIVE

count[7]=help['V']-count[5];            //SEVEN

count[9]=help['I']-count[6]-count[5]-count[8];   //NINE          //NINE

vector numsBefore(10);

for(size_t i=0;i<10;i++)

numsBefore[(i+2)%10]=count[i];//号码还原

for(size_t i=0;i<10;i++)

{

for(int j=0;j

cout<

}

cout<

}

}

return 0;

} 一楼的答案写的太复杂了

发表于 2018-04-18 16:38:13

回复(0)

4

统计拥有的字母数量,然后可以找到规律,只有0(ZERO)有字母Z,也就是说,有多少个Z就有多少个0。同理,只有2有字母W,4有字母U,6有字母X,8有字母G。

将上述单词从字母统计中删去,发现剩下的单词中,只有5有字母F,1有字母O,3有字母R,7有字母S。

再删去,发现只有9有字母I。

将以上数字统计后排序可得。 import java.util.*;

import java.lang.*;

public class Main {

static String[] table = { "ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE",

"SIX", "SEVEN", "EIGHT", "NINE" };

static int retL = 0;

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int i, j;

int n = sc.nextInt();

sc.nextLine();

String str;

int[] mark = new int[26];

int[] ret = new int[10000];

int temp = 0;

while (sc.hasNext()) {

retL = 0;

str = sc.nextLine();

for(i=0;i

mark[str.charAt(i)-'A']++;

}

if(mark['Z' - 'A'] != 0) handle(mark, ret, 2, 'Z');

if(mark['W' - 'A'] != 0) handle(mark, ret, 4, 'W');

if(mark['U' - 'A'] != 0) handle(mark, ret, 6, 'U');

if(mark['X' - 'A'] != 0) handle(mark, ret, 8, 'X');

if(mark['G' - 'A'] != 0) handle(mark, ret, 0, 'G');

if(mark['F' - 'A'] != 0) handle(mark, ret, 7, 'F');

if(mark['O' - 'A'] != 0) handle(mark, ret, 3, 'O');

if(mark['R' - 'A'] != 0) handle(mark, ret, 5, 'R');

if(mark['S' - 'A'] != 0) handle(mark, ret, 9, 'S');

if(mark['I' - 'A'] != 0) handle(mark, ret, 1, 'I');

Arrays.sort(ret,0,retL);

for (i = 0; i < retL; i++) {

System.out.print(ret[i]);

}

System.out.println();

}

}

public static void handle(int[] mark, int[] ret, int num, char point) {

int temp = mark[point - 'A'],i;

for (i = 0; i < temp; i++) {

ret[retL++] = num;

}

for (i = 0; i < table[(num+8)%10].length(); i++) {

mark[table[(num+8)%10].charAt(i) - 'A'] -= temp;

}

}

}

编辑于 2017-08-09 05:11:54

回复(1)

3

import java.util.HashMap;

import java.util.Map;

import java.util.Scanner;

public class Main { public static void main(String[] args) { // TODO Auto-generated method stub

Scanner sc=new Scanner(System.in);

int num=Integer.parseInt(sc.nextLine());//行数

String[] sArr=new String[num];//构建一个String数组存放输入的每行字符串

for(int i=0;i

sArr[i]=sc.nextLine();

}

for(String each:sArr) {

//构建一个map用于存储代表性字母的个数

//0-->Z; 2-->W; 4-->U; 6-->X; 8-->G;(唯一对应,每个字母的个数就代表其数字的个数)

//1-->O(1的个数计算方法:num(O)-num(0)-num(2)-num(4)= map(O)-map(Z)-map(W)-map(U))

//3-->R(3的个数计算方法:num(R)-num(0)-num(4)= map(R)-map(Z)-map(U))

//5-->F(5的个数计算方法:num(F)-num(4)= map(F)-map(U))

//7-->S(7的个数计算方法:num(S)-num(6)= map(S)-map(X))

//9-->N(注意,9里面有两个N,故计算结果应除以2:(num(N)-num(1)-num(7))/2=(map(N)-count(1)-count(7))/2)

Map map=new HashMap() {

{

put('Z',0);

put('W',0);

put('U',0);

put('X',0);

put('G',0);

put('O',0);

put('R',0);

put('F',0);

put('S',0);

put('N',0);                 }

};

for(int i=0;i

char c=each.charAt(i);

if(map.containsKey(c))

map.put(c, 1+map.get(c));

else

continue;//遇到不在字典里的字母就跳过

}

int[] count=new int[10];

count[0]=map.get('Z');

count[2]=map.get('W');

count[4]=map.get('U');

count[6]=map.get('X');

count[8]=map.get('G');

count[1]=map.get('O')-map.get('Z')-map.get('W')-map.get('U');

count[3]=map.get('R')-map.get('Z')-map.get('U');

count[5]=map.get('F')-map.get('U');

count[7]=map.get('S')-map.get('X');

count[9]=(map.get('N')-count[1]-count[7])/2;//NINE中有两个N

int[] countnew=new int[10];

for(int i=0;i<10;i++){

countnew[i]=count[(i+8)%10];//使用countnew数组存储加8以前的个数

}

for(int i=0;i<10;i++) {//按照从0到9的顺序输出

for(int j=0;j

System.out.print(i);

}

}

System.out.println();//输出完一个字符串换行

} }

}

发表于 2018-07-26 09:04:35

回复(0)

3

54183e4a7c5dcadfb98227543a0cfba6.png

一张图说明一切问题

发表于 2018-03-29 16:44:43

回复(2)

3

#include

#include

int v[10]={2,4,6,8,0,3,5,7,9,1},n,i,j,hash[10],tmp[26],cnt[26];

char dst[10][10]={"ZERO","TWO","FOUR","SIX",

"EIGHT","ONE","THREE","FIVE","SEVEN","NINE"},s[10005];

void dfs(int *x){

int i,cnt=0,j;

for(i=0;i<26;i++)

if(x[i]==0) cnt++;

if(cnt==26){

for(i=0;i<10;i++)

for(j=0;j

return;

}

for(i=0;i<26;i++) tmp[i]=x[i];

for(i=0;i<10;i++){

int flag=1;

for(j=0;j

x[dst[i][j]-'A']--;

if(x[dst[i][j]-'A']<0){

flag=0;break;

}

}

if(flag==1){

hash[v[i]]++,dfs(x);break;

}

for(j=0;j<26;j++) x[j]=tmp[j];

}

}

int main(){

for(scanf("%d",&n);n--;dfs(cnt),memset(hash,0,sizeof(hash))){

scanf("%s",s);

memset(cnt,0,sizeof(cnt));

for(j=0;s[j]!='\0';j++) cnt[s[j]-'A']++;

}

}//dfs删除,注意删除顺序,0 2 4 6 8是具备唯一特征字母的

//排除0 2 4 6 8,之后,1 3 5 7是具备唯一特征的,最后就剩9了

编辑于 2017-10-23 08:49:06

回复(0)

2

var n=readline();

while(str=readline()){ changedNum(str);

}

function changedNum(str){

var reg1=[/Z/g,/W/g,/U/g,/X/g,/G/g];//0,2,4,6,8;

var reg2=[/O/g,/H/g,/F/g,/S/g,/N/g];//1,3,5,7,9;

var result=[];

var num_arr=new Array(10).fill(0);

for(let i=0,j=0;i

}

for(let i=0,j=1;i

break; } j++;

}

for(let i=0;i=8){ result.push(i-8); }else{ result.push(i+2); } } }

console.log(result.sort((x,y)=>{return x-y}).join(""));

}

发表于 2018-07-31 19:29:54

回复(0)

3

一开始忘记“’NINE”是两个N了,9的时候在数N             /(ㄒoㄒ)/~~ #include

#include

#include

#include

using namespace std;

int main()

{

char ch[] = { 'Z', 'W', 'X', 'S', 'U', 'O', 'R', 'F', 'G', 'I' };

int dig[] = { 0, 2, 6, 7, 4, 1, 3, 5, 8, 9 };

string ch_all[] = { "ZERO", "TWO", "SIX", "SEVEN", "FOUR", "ONE", "THREE", "FIVE", "EIGHT", "NINE" };

int T;

for (auto &i : dig)

{

i-= 8;

if (i < 0)

i+= 10;

}

while (cin >> T)

{

while (T--)

{

int count[26] = { 0 };

string str;

cin >> str;

vector dig_cout;

for (auto i : str)

{

count[i - 'A']++;

}

for (int i = 0; i < 10; i++)

{

int tmp_c = count[ch[i] - 'A'];

if (tmp_c>0)

for (auto j : ch_all[i])

count[j - 'A'] -= tmp_c;

while (tmp_c--)

dig_cout.push_back(dig[i]);

}

sort(dig_cout.begin(), dig_cout.end());

for (auto i : dig_cout)

cout << i;

cout << endl;

}

}

return 0;

}

发表于 2017-08-21 17:32:48

回复(1)

1

#coding=utf-8

n=int(input())

di=[[['Z','ZERO',2],['W','TWO',4],['U','FOUR',6],['X','SIX',8],['G','EIGHT',0]], #查询字典,分2部分,'ZERO','TWO'等包含特定唯一字符'z','w'

[['O','ONE',3],['R','THREE',5],['F','FIVE',7],['S','SEVEN',9]]]              #'ONE','THREE'去掉上面的唯一字符后,也只包含特定唯一字符'O','R'

for i in range(n):                                                               #最后只剩'NINE'需要特殊处理

num=list(input()) #输入

num.sort() #排序

re=[]

for j in range(2): #调用字典

for d in di[j]: #字典内部遍历

if d[0] in num: #是否包含特定唯一字符

k=num.count(d[0]) #唯一特定字符个数就是代表数字个数,也是其他字母个数,如有k个'Z'就有k个'ERO'

for d0 in d[1]:

s=num.index(d0)

del num[s:s+k] #删除k个'ZERO'

re+=[d[2]]*k #代表的数字(减去8)

re+=[1]*(int(len(num)/4)) #剩余都是NINE

re.sort()#排序,找到最小的

re=[str(i) for i in re]

re=''.join(re)#组合

print(re)

发表于 2020-08-05 22:47:27

回复(0)

1

def func(x): #计算乱序字母中的ZERO,ONE,TWO...NINE的数量

dict = [ 0 for i in range(10)]

tab = [ 0 for i in range(10)]

num_Z = x.count('Z') #0 ZERO

num_W = x.count('W') #2 TWO

num_U = x.count('U') #4 FOUR

num_X = x.count('X') #6 SIX

num_G = x.count('G') #8 EIGHT

num_S = x.count('S') - num_X # 7 SEVEN

num_F = x.count('F') - num_U # 5 FIVE

num_T = x.count('T') - num_W - num_G # 3 THREE

num_O = x.count('O') - num_Z - num_W - num_U # 1 ONE

num_I = x.count('I') - num_F - num_X - num_G # 9 NINE

dict[0] = num_Z

dict[1] = num_O

dict[2] = num_W

dict[3] = num_T

dict[4] = num_U

dict[5] = num_F

dict[6] = num_X

dict[7] = num_S

dict[8] = num_G

dict[9] = num_I

tab[0] = dict[8]

tab[1] = dict[9]

tab[2] = dict[0]

tab[3] = dict[1]

tab[4] = dict[2]

tab[5] = dict[3]

tab[6] = dict[4]

tab[7] = dict[5]

tab[8] = dict[6]

tab[9] = dict[7]

s = ""

for i in range(len(tab)):

s += str(i)*tab[i]

return s

import sys

x = sys.stdin.readlines()

for i in range(1,len(x)):

print(func(x[i]))

编辑于 2018-09-05 10:38:15

回复(0)

1

//特别要注意9 nine 不能用n去判断除非除以2

import java.io.BufferedReader; import java.io.IOException;

import java.io.InputStreamReader;

/**

* @author Y.bear

* @version 创建时间:2018年9月3日 下午2:54:32 类说明

*/

public class Main {

public static void main(String[] args) throws IOException {

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

int times = Integer.valueOf(reader.readLine());

String[] results=new String[times];

for (int i = 0; i

int[] result = new int[10];

String readLine = reader.readLine();

transform(readLine, result);

print(result,i,results);

}

for (String string : results) {

System.out.println(string);

}

}

public static void print(int[] result,int index,String[] results) {

StringBuffer buffer=new StringBuffer();

for (int i = 0; i < result.length; i++) {

while (result[i] > 0) {

result[i]--;

buffer.append(i);

}

}

results[index]=buffer.toString();

}

public static void getResult(int num, int count, int[] result) {

while (count > 0) {

count--;

result[(num + 2) % 10]++;

}

}

public static void transform(String line, int[] result) {

char[] letters = new char[26];

char[] charArray = line.toUpperCase().toCharArray();

for (char c : charArray) {

letters[c - 'A']++;

}

int zero = letters['Z' - 'A'];

getResult(0, zero, result);

letters['Z' - 'A'] -= zero;

letters['E' - 'A'] -= zero;

letters['R' - 'A'] -= zero;

letters['O' - 'A'] -= zero;

int two = letters['W' - 'A'];

getResult(2, two,result);

letters['T' - 'A'] -= two;

letters['W' - 'A'] -= two;

letters['O' - 'A'] -= two;

int four = letters['U' - 'A'];

getResult(4, four, result);

letters['F' - 'A'] -= four;

letters['O' - 'A'] -= four;

letters['U' - 'A'] -= four;

letters['R' - 'A'] -= four;

int six = letters['X' - 'A'];

getResult(6, six, result);

letters['S' - 'A'] -= six;

letters['I' - 'A'] -= six;

letters['X' - 'A'] -= six;

int eight = letters['G' - 'A'];

getResult(8, eight, result);

letters['E' - 'A'] -= eight;

letters['I' - 'A'] -= eight;

letters['G' - 'A'] -= eight;

letters['H' - 'A'] -= eight;

letters['T' - 'A'] -= eight;

int one = letters['O' - 'A'];

getResult(1, one, result);

letters['O' - 'A'] -= one;

letters['N' - 'A'] -= one;

letters['E' - 'A'] -= one;

int three = letters['T' - 'A'];

getResult(3, three, result);

letters['T' - 'A'] -= three;

letters['H' - 'A'] -= three;

letters['R' - 'A'] -= three;

letters['E' - 'A'] -= three;

letters['E' - 'A'] -= three;

int five = letters['F' - 'A'];

getResult(5, five, result);

letters['F' - 'A'] -= five;

letters['I' - 'A'] -= five;

letters['V' - 'A'] -= five;

letters['E' - 'A'] -= five;

int seven = letters['S' - 'A'];

getResult(7, seven, result);

letters['S' - 'A'] -= seven;

letters['E' - 'A'] -= seven;

letters['V' - 'A'] -= seven;

letters['E' - 'A'] -= seven;

letters['N' - 'A'] -= seven;

int nine = letters['I' - 'A'];

getResult(9, nine, result);

letters['N' - 'A'] -= nine;

letters['I' - 'A'] -= nine;

letters['N' - 'A'] -= nine;

letters['E' - 'A'] -= nine;

}

}

发表于 2018-09-03 16:48:21

回复(0)

1

//number代表字符串,bucket是转化后的数组

#include

#include

#include

using namespace std;

int main(){

int n;

cin>>n;

while(n--){

string s;

cin >> s;

map number;

int* bucket = new int [10];

for(int i = 0; i < s.length(); i++)

number[s[i]]++;

bucket[2] = number['Z'];

bucket[4] = number['W'];

bucket[6] = number['U'];

bucket[8] = number['X'];

bucket[0] = number['G'];

bucket[3] = number['O'] - bucket[2] - bucket[4] - bucket[6];

bucket[5] = number['R'] - bucket[2] - bucket[6];

bucket[7] = number['F'] - bucket[6];

bucket[9] = number['S'] - bucket[8];

bucket[1] = number['I'] - bucket[7] - bucket[8] - bucket[0];

for(int i = 0;i<10;i++){

while(bucket[i]--)

cout<

}

cout<

}

return 0;

}

发表于 2018-04-17 20:39:17

回复(0)

1

//丧心病狂的题目

importjava.util.Scanner; public classMain { public static voidmain(String[] args) {

Scanner in = newScanner(System.in); intt = Integer.parseInt(in.nextLine()); for(inti = 0; i < t; i++) { doWork(in);

}

} public static voiddoWork(Scanner in) {

String s = in.nextLine(); int[] cs = new int[27]; for(inti = 0; i < s.length(); i++) {

cs[s.charAt(i) - 'A']++;

} int[] num = new int[10];

num[0] = cs['Z'- 'A'];

num[6] = cs['X'- 'A'];

num[2] = cs['W'- 'A'];

num[4] = cs['U'- 'A'];

num[8] = cs['G'- 'A'];

num[3] = cs['T'- 'A'] - num[2] - num[8];

num[7] = cs['S'- 'A'] - num[6];

num[5] = cs['V'- 'A'] - num[7];

num[1] = cs['O'- 'A'] - num[0] - num[2] - num[4];

num[9] = (cs['N'- 'A'] - num[7] - num[1]) / 2;

StringBuilder builder = newStringBuilder(); for(inti = 8; i <=9; i++) { for(intj = 0; j < num[i]; j++) {

builder.append((i+2)%10);

}

} for(inti = 0; i <=7; i++) { for(intj = 0; j < num[i]; j++) {

builder.append(i+2);

}

}

System.out.println(builder.toString());

}

}

发表于 2018-03-07 21:10:19

回复(0)

1

我的也是10%,我感觉测试数据给错了……

测试数据:

84

……

但是结果并没有84个测试数据,只有5个。

我的程序思路和大家大同小异:判断关键字。

比如ZERO,关键字为Z,那么数组a[10]内a[0]++,a[n]表示n的个数。

假如其他字母有O作为关键字,比如ONE,那么遇到Z,就执行:a[0]++,a[1]--;

a[1]--,就是要抵消掉ZERO里面的O给ONE带来的影响。

C++程序:

#include

#include

using namespace std;

//输入字符串str,返回对字符串总数字统计的结果a[10]

void check(int a[], string str);

//输出统计后的数组,比如a[0]=3,就输出3个0

void out_num(int a[10]);

int main() {

int num;

string str;

int a[100][10] = { 0 };

//网上测试,会用文件代替cin

while (cin>>num) {

for (int k = 0; k < num; k++) {

a[k][10] = { 0 };

cin >> str;

check(a[k], str);

}

for (int i = 0; i < num; i++) {

out_num(a[i]);

}

}

}

void out_num(int a[10]) {

//输出数字,8→0,9→1,0→2……

for (int k = 0; k < a[8]; k++)

cout << 0;

for (int k = 0; k < a[9]; k++)

cout << 1;

for (int j = 0; j < 8; j++)

for (int k = 0; k < a[j]; k++)

cout << j + 2;

cout<

}

void check(int a[], string str) {

int i = 0;

//假如用scanf,就要用\0判断结束标志,预留一个字节系统自动放置\0;

//假如用gets,就用\n判断;因为它会把你的\n也会读过来。

while (str[i] != '\0') {

switch (str[i]) {

case 'Z':

a[0]++;

a[1]--;    //O

break;

case 'O':

a[1]++;

break;

case 'W':

a[2]++;

a[1]--;    //O

break;

case 'H':

a[3]++;

break;

case 'U':

a[4]++;

a[1]--;    //O

break;

case 'V':

a[5]++;

a[9]--;    //I

break;

case 'X':

a[6]++;

a[7]--;    //S

a[9]--;    //I

break;

case 'S':

a[7]++;

a[5]--;    //V

break;

case 'G':

a[8]++;

a[3]--;    //H

a[9]--;    //I

break;

case 'I':

a[9]++;

break;

default:

break;

}

i++;

}

}

发表于 2018-02-05 16:13:22

回复(2)

1

提示格式错误,但是没找出来,有人能帮忙看看吗?

import java.util.Scanner;

public class Number {

public static void main(String[] argv) {

Scanner sin = new Scanner(System.in);

int count = sin.nextInt();

while (count-- >= 0) {

String str = sin.nextLine();

int[] stringNumber = new int[26];

String reString = "";

String[] array = { "EIGHT", "NINE", "ZERO", "ONE", "TWO", "THREE",

"FOUR", "FIVE", "SIX", "SEVEN" };

char[] strs = str.toCharArray();

for (int i = 0; i < strs.length - 1; i++) {

stringNumber[strs[i] - 'A'] += 1;

}

for (int i = 0; i < array.length; i++) {

reString = reString

+ dealString(stringNumber, array[i], i + "");

}

System.out.printf(reString + "\n");

}

}

private static String dealString(int[] stringNumber, String str, String tag) {

String string = "";

char[] numStrs = str.toCharArray();

for (int i = 0; i < numStrs.length - 1; i++) {

if (stringNumber[numStrs[i] - 'A'] <= 0) {

return string;

}

}

for (int i = 0; i < numStrs.length - 1; i++) {

stringNumber[numStrs[i] - 'A'] -= 1;

}

return tag + dealString(stringNumber, str, tag);

}

}

发表于 2018-01-30 23:13:30

回复(0)

1

#include

#include

#include

using namespace std;

int main()

{ char ch[] = {'Z','W','X','S','U','O','R','F','G','I'}; int d[] = {0,2,6,7,4,1,3,5,8,9}; string num[] = {"ZERO","TWO","SIX","SEVEN","FOUR","ONE","THREE","FIVE","EIGHT","NINE"}; int T; for(int i=0;i<10;i++) { d[i] -= 8; if(d[i]<0) d[i] += 10; } while(cin>>T) { while(T--) { int count[26]={0}; string s; cin>>s; vector result; for(int i=0;i0) for(int j=0;j

}

发表于 2018-01-17 01:19:33

回复(0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值