首页 > 试题广场 >

最难的问题

[编程题]最难的问题
  • 热度指数:4528 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
NowCoder生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递。假设你是军团中的一名军官,需要把发送来的消息破译出来、并提
供给你的将军。
消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A 都分别替换成字母F),其他字符不 变,并且消息原文的所有字母都是大写的。密码中的字母与原文中的字母对应关系如下。
密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
原文字母:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U

输入描述:
输入包括多组数据,每组数据一行,为收到的密文。
密文仅有空格和大写字母组成。


输出描述:
对应每一组数据,输出解密后的明文。
示例1

输入

HELLO WORLD<br/>SNHJ

输出

CZGGJ RJMGY<br/>NICE

发表于 2019-11-29 17:02:21 回复(5)
 import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            char[] sw=new char[130];
            String str1="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            String str2="VWXYZABCDEFGHIJKLMNOPQRSTU";
            for(int i=0;i<str1.length();i++){
                sw[str1.charAt(i)]=str2.charAt(i);
            }
            String str=sc.nextLine();
            String result="";
            for(int i=0;i<str.length();i++){
                if(str.charAt(i)==' '){
                    result+=" ";
                }else{
                    result+=sw[str.charAt(i)];
                }
            }
            System.out.println(result);
        }
    }
}

发表于 2018-10-01 15:38:13 回复(1)
//规律还是很明显的,主要看临界点那分两种情况即可,最没技术含量的就是switch case,其实这种情况是有规律的。
importjava.util.Scanner;
 
publicclassMain {
    publicstaticvoidmain(String[] args) {
        Scanner in = newScanner(System.in);
        while(in.hasNext()){
            String str=in.nextLine();
            char[] arr = str.toCharArray();
            intlen=str.length();
            StringBuffer sb=newStringBuffer();
            for(inti = 0; i < len; i++) {
                charc=arr[i];
                if(c!=' '){
                    if(c>'E'){
                        c=(char)((int)c-5);
                    }
                    else{
                        c=(char)((int)c-65+86);
                    }
                }
                sb.append(c);
            }
            System.out.println(sb.toString());
        }
    }
}

发表于 2017-08-01 09:59:58 回复(0)
这个,直接一一对应就好了,因为给的数据是A-Z的顺序,将密文放进数组里直接对
string str,res;
    char *key = "VWXYZABCDEFGHIJKLMNOPQRSTU";
    while(getline(cin,str)){
        res = "";
        for(int i = 0;i<str.size();i++){
            if(str[i]==' '){
                res+=' ';continue;
            }
            res += key[str[i]-'A'];
        }
        cout<<res<<endl;
    }
    return 0;
发表于 2016-08-16 09:30:57 回复(0)
#include<iostream>
#include<string>

using namespace std;


int main()
{
string ch;
while(getline(cin,ch))
{
int len=ch.length();
int i=0;
for (int i=0;i<len;i++)
{
switch(ch[i])
{

case 'A':
ch[i]='V';
break;

case 'B':
ch[i]='W';
break;

case 'C':
ch[i]='X';
break;
case 'D':
ch[i]='Y';
break;

case 'E':
ch[i]='Z';
break;

case 'F':
ch[i]='A';
break;
case 'G':
ch[i]='B';
break;

case 'H':
ch[i]='C';
break;

case 'I':
ch[i]='D';
break;
case 'J':
ch[i]='E';
break;

case 'K':
ch[i]='F';
break;

case 'L':
ch[i]='G';
break;
case 'M':
ch[i]='H';
break;

case 'N':
ch[i]='I';
break;

case 'O':
ch[i]='J';
break;
case 'P':
ch[i]='K';
break;

case 'Q':
ch[i]='L';
break;

case 'R':
ch[i]='M';
break;
case 'S':
ch[i]='N';
break;

case 'T':
ch[i]='O';
break;

case 'U':
ch[i]='P';
break;
case 'V':
ch[i]='Q';
break;

case 'W':
ch[i]='R';
break;

case 'X':
ch[i]='S';
break;
case 'Y':
ch[i]='T';
break;

case 'Z':
ch[i]='U';
break;
default:
ch[i]=' ';
break;


}

}
cout<<ch<<endl;

}


return 0;

}
发表于 2015-08-20 21:31:02 回复(3)

python solution:

while True:
    try:
        a, res = input(), ""
        for i in a:
            if i == " ":
                res += i
            elif i > "E":
                res += chr(ord(i) - 5)
            else:
                res += chr(ord(i) + 21)
        print(res)
    except:
        break
发表于 2017-10-11 09:53:10 回复(0)
#include <stdio.h>

int main() {
    int c;
    while ((c = getchar()) != EOF){
        if ('A' <= c) {
	    c = 'E' < c ? (c - 5) : (c + 21);
        }
        putchar(c);
    } 
}
运算优于查表,查表优于判断。
发表于 2016-08-16 10:03:13 回复(1)
#include <iostream>
#include <string>
using namespace std;
int main(){
    string str;
    while(getline(cin, str)){
        for(auto& e : str){
            if(e >= 'A'&& e <= 'Z'){
                e = (e >= 'F') ? (e - 5) : (e + 21);
            }
        }
        cout << str << endl;
    }
    return 0;
}

发表于 2020-07-17 15:18:31 回复(0)
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string s;
    while(getline(cin,s))
    {
        for(int i=0;i<s.size();i++)
        {
            if(s[i]>='A' && s[i]<='Z')
                s[i]=(s[i]-'A'+21)%26+'A';
        }
        cout<<s<<endl;
    }
    return 0;
}

编辑于 2021-08-07 01:18:56 回复(1)
#include <iostream>
using namespace std;

int main() {
    char c;
    while ((c=getchar())!=EOF) 
    {
        if(c>='A'&&c<='Z')
        {
            if(c>'E')
            {
                c-=5;
            }
            else
            {
                c+=21;   
            }
        }
        putchar(c);
    }
    return 0;
}
发表于 2023-11-05 15:32:46 回复(0)
利用英文字母ASCII值的规律进行问题的求解,此处要注意对输入的空格进行一下处理

import java.util.Arrays;
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner str = new Scanner(System.in);
        while (str.hasNextLine()) {
            String s = str.nextLine();
            System.out.println(soluation(s));
        }
    }
    public static String soluation(String s) {
        char[] c = s.toCharArray();
        int[] n = new int[c.length];
        for (int i = 0; i < c.length; i++) {
            if (c[i] != ' ') {
                n[i] = (int) c[i];
                if (n[i] <= 69) {
                    n[i] = n[i] + 21;
                } else {
                        n[i] = n[i] - 5;
                }
            } else {
                n[i] = 0;
            }
        }
        char[] a = new char[n.length];
        for (int i = 0; i < a.length; i++) {
            if (n[i] != 0) {
                a[i] = (char) n[i];
            } else {
                a[i] = ' ';
            }
        }
        String aws = String.valueOf(a);
        return aws;
    }
 
}

发表于 2023-11-04 16:54:20 回复(0)
明明是替换成了前面五个字母,出题人有种不长脑子的美
#include <iostream>
#include <string>
using namespace std;

int main() 
{
    const string Alphx = "VWXYZABCDEFGHIJKLMNOPQRSTU";
    string word;
    while(getline(cin,word))
    {

        for(int i = 0;i<word.size();i++)
        {
            if(isalpha(word[i]))
            {
               word[i] = Alphx[word[i]-'A'];
            }
        }

        cout << word << endl;
    }


    return 0;
}
// 64 位输出请用 printf("%lld")


发表于 2023-08-12 17:25:52 回复(0)
// 注意此题用到了类似环形队列的想法

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str;
    while (getline(cin, str)) {

        for (auto& e : str) {
            if (e >= 'A' && e <= 'Z') {
                e = ((e-'A'-5+26)%26)+'A';
            }
        }

        cout << str << endl;
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

发表于 2023-07-27 20:51:03 回复(0)
 注意是已知密文,要求原文.
import javax.xml.soap.SAAJMetaFactory;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String str = sc.nextLine();
            StringBuffer stringBuffer = new StringBuffer();
            for (int i = 0; i < str.length(); i++) {
                char cur = str.charAt(i);
                if(cur == ' '){
                    stringBuffer.append(' ');
                } else {
                    stringBuffer.append((char)(cur > 'E' ? cur + 5 : cur - 21));
                }
            }
            System.out.println(stringBuffer);
        }
    }
}

发表于 2022-11-17 19:11:30 回复(0)
// write your code here
import java.util.*;

public class Main{
    
        public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String str2 = "VWXYZABCDEFGHIJKLMNOPQRSTU";
        while (scanner.hasNextLine()) {
            String des = scanner.nextLine();
            String ret = "";
            for (int i = 0; i < des.length(); i++) {
                char ch = des.charAt(i);
                if(ch==' '){
                    ret+=' ';
                    continue;
                }
                for (int j = 0; j < str1.length(); j++) {
                    if (ch == str1.charAt(j)) {
                        ret += str2.charAt(j);
                    }
                }
            }
            System.out.println(ret);
        }
    }

}
发表于 2022-09-10 01:22:42 回复(0)
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while (sc.hasNext()){
            String str=sc.nextLine();
            char[] arr=str.toCharArray();
            for (int i = 0; i < arr.length; i++) {
                if (arr[i]==' '){
                    continue;
                }
                if (arr[i]<'F'){
                    arr[i]=(char)(arr[i]+21);
                }
                else{
                    arr[i]=(char)(arr[i]-5);
                }
            }
            String s=new String(arr);
            System.out.println(s);
        }
    }
}

发表于 2022-09-05 15:37:22 回复(0)
// write your code here
import java.util.*;
public class Main{
    public static void main(String[] args){
       //密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
       //原文字母:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
       //输入密码 输出明文!
        //对照表:
        String table = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String str = sc.nextLine();
            StringBuilder sb = new StringBuilder();
            for(int i = 0;i<str.length();i++){
                if(str.charAt(i)==' '){//空格直接保存!
                    sb.append(' ');
                    continue;
                }
                 int index =(table.indexOf(str.charAt(i))-5+26)%26;
                //我们先找到这个密文在table的下标 - 5后得到明文位置下标,
                //有可能,下标会向前越界所以+26 最后%26反正向后越界!
                //我们就得到了对应明文的下标位置!
                sb.append(table.charAt(index));
            }
            System.out.println(sb);
        }
    }
}

发表于 2022-05-13 20:31:07 回复(0)
import java.util.*;
public class Main{
   public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        while(scanner.hasNext()){
            String str=scanner.nextLine();
            String str2="";
            for(int i=0;i<str.length();i++){
                if(str.charAt(i)>='F'&&str.charAt(i)<='Z'){
                    int a=(int)str.charAt(i)-5;
                    str2+=(char)a;
                }else if(str.charAt(i)>='A'&&str.charAt(i)<='E'){
                    int a=(int)str.charAt(i)+21;
                    str2+=(char)a;
                }else{
                    str2+=str.charAt(i);
                }
            }
            System.out.println(str2);
        }
    }
}
注意这题是多组输入
发表于 2022-05-07 17:44:31 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String str = sc.nextLine();
            char[] ch = str.toCharArray();
            StringBuilder sb = new StringBuilder();
            for(int i = 0;i < ch.length;i++){
                if(ch[i] >= 'A' && ch[i] <= 'E'){
                    sb.append((char)((int)ch[i] + 21));
                }else if(ch[i] > 'E' && ch[i] <= 'Z'){
                    sb.append((char)((int)ch[i] - 5));
                }else{
                    sb.append(" ");
                }
            }
            System.out.println(sb.toString());
        }
    }
}

应用StringBulider
编辑于 2022-05-08 16:33:33 回复(0)
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s;
    while(getline(cin,s))
    {
        for(int i=0;i<s.size();i++)
        if(s[i]<='Z'&&s[i]>='A')
            s[i]=s[i]>'E'?(s[i]-5):(s[i]+21);
        cout<<s<<endl;
    }
}

发表于 2022-03-27 15:07:06 回复(0)