华为机试 (9/29)

简单密码破解

他是这么变换的,大家都知道手机上的字母: 1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,就这么简单,渊子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,
声明:密码中没有空格,而密码中出现的大写字母则变成小写之后往后移一位,如:X,先变成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。
示例
输入
YUANzhi1987
输出
zvbo9441987

// Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        //输入不为空
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < str.length(); i++) {
                //获取第i个字符
                char c = str.charAt(i);
                //判断,处理
                if (c >= 'A' && c < 'Z') {
                    c = (char) (c + 'b' - 'A');
                } else if (c == 'Z') {
                    c = 'a';
                } else if (c>='a' && c<='c') {
                    c = '2';
                } else if (c>='d' && c<='f') {
                    c = '3';
                } else if (c>='g' && c<='i') {
                    c = '4';
                } else if (c>='j' && c<='l') {
                    c = '5';
                } else if (c>='m' && c<='o') {
                    c = '6';
                } else if (c>='p' && c<='s') {
                    c = '7';
                } else if (c>='t' && c<='v') {
                    c = '8';
                } else if (c>='w' && c<='z') {
                    c = '9';
                }
                sb.append(c);
            }
            System.out.println(sb.toString().trim());
    }
}
#include<iostream>
#include<string>
using namespace std;
const string dict1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
const string dict2="bcdefghijklmnopqrstuvwxyza22233344455566677778889999";
char Char_Change(char a){
    for(int i=0;i<dict1.size();i++)
        if(dict1[i]==a) return dict2[i];
    return a;
}
int main(){
    //string data="YUANzhi1987";
    string data;
    while(getline(cin,data)){
        for(int i=0;i<data.size();i++)
            data[i] = Char_Change(data[i]);
        cout<<data<<endl;
    }
    return 0;
}

#include <stdio.h>
#include <string.h>
int main()
{
    char str[100],b[100];
    gets(str);
    int i;
    while(str)
    {
    int len=strlen(str);
    for (i=0;i<len;i++)
    { 
        if('a'<=str[i]&&str[i]<='c')
        str[i]='2';
        else if('d'<=str[i]&&str[i]<='f')
        str[i]='3';
        else if('g'<=str[i]&&str[i]<='i')
        str[i]='4';
        else if('j'<=str[i]&&str[i]<='l')
        str[i]='5';
        else if('m'<=str[i]&&str[i]<='o')
        str[i]='6';
        else if('p'<=str[i]&&str[i]<='s')
        str[i]='7';
        else if('t'<=str[i]&&str[i]<='v')
        str[i]='8';
        else if('w'<=str[i]&&str[i]<='z')
        str[i]='9';
        else if('A'<=str[i]&&str[i]<'Z')
        str[i]=str[i]+32+1;
        else if(str[i]=='Z')
        str[i]='a';
        else
        str[i]=str[i];
    }
    printf("%s\n",str);
    //printf("\0");
    return 0;   
}
    }

字符串排序

编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y

// Java
import java.io.*;
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) {
			char[] arr = str.toCharArray();
			StringBuilder builder = new StringBuilder();
			// 英文字母从 A 到 Z 排列,不区分大小写:26 个
			for (int i = 0; i < 26; i++) {
				char c = (char) ('A' + i);
				// 遍历字符串
				for (int j = 0, length = str.length(); j < length; j++) {
					// 不区分大小写
					if (c == arr[j] || c == arr[j] - 'a' + 'A') {
						builder.append(arr[j]);
					}
				}
			}
			// 非英文字母的其它字符保持原来的位置
			for (int i = 0, length = str.length(); i < length; i++) {
				if (!((arr[i] >= 'A' && arr[i] <= 'Z') || (arr[i] >= 'a' && arr[i] <= 'z'))) {
					builder.insert(i, arr[i]);
				}
			}
			System.out.println(builder.toString());
		}
	}
}
#include<vector>
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s;
    vector<char> tempChar;
    while(getline(cin,s))
    {
        tempChar.clear();
        int len = s.size();
        for(int j=0; j<26; j++)
        {
            for(int i=0; i<len; i++)
            {
                if(s[i]-'a'==j||s[i]-'A'==j)  // 将所有的字母压入栈中
                {
                    tempChar.push_back(s[i]);
                }
            }
        }
        for(int i=0,k=0;(i<len)&&k<tempChar.size();i++)
        {
            if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
                s[i]=tempChar[k++];
        }
        cout<<s<<endl;
    }
    return 0;
}

图片整理

Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过C语言解决。

// Java
import java.util.*;
import java.io.*;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = "";
        while((s=br.readLine())!=null){
            char[] result = s.toCharArray();
            Arrays.sort(result);
            System.out.println(String.valueOf(result));
        }
    }
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char str[1000];
    while(scanf("%s",str)!=EOF)
    {
        int a[256]={0},i,len,j;
        len=strlen(str);
        for(i=0;i<len;i++)
        {
            a[str[i]]++;
        }
        for(j=0;j<256;j++)
        {
            while(a[j]!=0)
            {
                printf("%c",j);
                a[j]--;
            }  
        }
        printf("\n");
    }
    return 0;
}

蛇形矩阵

蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
样例输入
5
样例输出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11

// Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = null;
		StringBuilder sb = new StringBuilder();
		while ((str = br.readLine()) != null) {
			int num = Integer.parseInt(str), count = 0, first = 1;
			for (int i = 0; i < num; i++) {
				first += i;
				count = first;
				sb.append(count).append(' ');
				for (int j = i + 2; j <= num; j++) {
					count += j;
					sb.append(count).append(' ');
				}
				sb.append("\n");
			}
			System.out.print(sb);
			sb.delete(0, sb.length());
		}
	}
}

``````javascript
#include<iostream>
using namespace std;
int main(int argc, char** argv)
{
	int n;
	while (cin >> n)
	{
		int beg = 1;
		for (int i = 1; i <= n; ++i)
		{
			cout << beg;
			int temp = beg;
			for (int j = i + 1; j <= n; ++j)
			{
				temp += j;
				cout << ' '<<temp;
			}
			beg += i;
			cout << endl;
		}
	}
}

字符串加密

有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,其余几个丢弃。现在,修改过的那个单词属于字母表的下面,如下所示:
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
T R A I L B Z E S C D F G H J K M N O P Q U V W X Y
上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙,Attack AT DAWN(黎明时攻击)就会被加密为Tpptad TP ITVH。
请实现下述接口,通过指定的密匙和明文得到密文。

// Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String key;
        while ((key = br.readLine()) != null) {
            char[] chars = key.toLowerCase().toCharArray();
            char[] dict = new char[26];
            int index = 0;
            tag1:
            for (char ch : chars) {
                for (int i = 0; i < index; i++) {
                    if (ch == dict[i]) {
                        continue tag1;
                    }
                }
                dict[index] = ch;
                index++;
            }
            char ch = 'a';
            tag2:
            for (int i = 0; i < 26; i++) {
                for (int j = 0; j < index; j++) {
                    if (dict[j] == ch) {
                        ch++;
                        continue tag2;
                    }
                }
                dict[index] = ch;
                ch++;
                index++;
            }
            String str = br.readLine();
            char[] res = str.toCharArray();
            for (int i = 0; i < res.length; i++) {
                if(res[i] - 'a'>=0){
                    res[i] = dict[res[i] - 'a'];
                }else{
                    res[i] = dict[res[i] - 'A'];
                }
            }
            System.out.println(String.valueOf(res));
        }
    }
}
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int main(void){
    string key,data;
    while(cin >> key >> data){
        //输入密钥和明文输出密文
        //首先根据秘钥进行映射的生成
        vector<bool> charecter(26,false); //看看我们这26个字母都用啥了
        vector<char> transfer;
        for(int i = 0;i < key.length();i++)
            if(key[i] >= 'a' && key[i] <= 'z')
                if(!charecter[key[i]-'a']){ //这单词首次出现
                     transfer.push_back(key[i]-'a'+'A'); //映射表只放大写的
                     charecter[key[i]-'a'] = true;
                }
            else if(key[i] >= 'A' && key[i] <= 'Z')
                if(!charecter[key[i]-'A']){//这单词首次出现
                     transfer.push_back(key[i]); 
                     charecter[key[i]-'A'] = true;
                }
        for(int i = 0;i < 26;i++) //剩下的得补齐啊
            if(!charecter[i])
                transfer.push_back(i+'A'); 
        //映射表做好了
        string res;
        for(int i = 0;i < data.length();i++){
            if(data[i]>= 'a' && data[i] <= 'z')
                res += transfer[data[i]-'a']+'a'-'A';
            else if(data[i]>= 'A' && data[i] <= 'Z')
                res += transfer[data[i]-'A'];
        }
        cout << res << endl;
    }
    return 0;
}
```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值