天天看点

字符串--------》排序、转换字符串排序【中级】单词倒排字符串合并处理字符串加解密字符串加密 字符串通配符

字符串排序

题目描述

编写一个程序,将输入字符串中的字符按如下规则排序。

规则 1 :英文字母从 A 到 Z 排列,不区分大小写。

如,输入: Type 输出: epTy

规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。

如,输入: BabA 输出: aABb

规则 3 :非英文字母的其它字符保持原来的位置。

如,输入: By?e 输出: Be?y

注意有多组测试数据,即输入有多行,每一行单独处理(换行符隔开的表示不同行)

输入描述:

输入字符串
           

输出描述:

输出字符串
           

示例1

输入

A Famous Saying: Much Ado About Nothing (2012/8).
           

输出

A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
           

解法1

while True:
    try:
        s = input()
        res,chars = [False]*len(s),[]
        for i,v in enumerate(s):
            if v.isalpha():
                chars.append(v) 
            else:
                res[i] = v
        chars.sort(key=lambda c:c.lower())
        for i,v in enumerate(res):
            if not v:
                res[i] = chars[0]
                chars.pop(0)
        print("".join(res))
    except:
        break
           

解法2

while True:
    try:
        s = input()
        res,chars = [False]*len(s),""
        for i,v in enumerate(s):
            if v.isalpha():
                chars+=v
            else:
                res[i] = v
        chars = sorted(chars, key=lambda c:c.lower())
        for i,v in enumerate(res):
            if not v:
                res[i] = chars[0]
                chars.pop(0)
        print("".join(res))
    except:
        break
           

【中级】单词倒排

题目描述

对字符串中的所有单词进行倒排。

说明:

1、构成单词的字符只有26个大写或小写英文字母;

2、非构成单词的字符均视为单词间隔符;

3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;

4、每个单词最长20个字母;

输入描述:

输入一行以空格来分隔的句子

输出描述:

输出句子的逆序

示例1

输入

I am a student

输出

student a am I

拿到题自己以为很简单(实际也不难^_^),自己的解法如下:

while True:
    try:
        str_list = []
        temp = ''
        for c in input():
            if c.isalpha():
                temp += c
            else:
                if temp != '':
                    str_list.append(temp)
                    temp = ''
        print(' '.join(str_list[::-1]))            
    except:
        break
           

在测试程序中没有通过,原因是此种解法原有的字符串中如果最后字符是英文字母的话,程序没有算在内!!,所以是失败的!!

推荐的正确解法如下:

import re
try:
    while True:
        string = ""
        for c in input():
            if c.isalpha():
                string += c
            else:
                string += " "
        str_spac = re.findall("[ ]+", string)
        for c in str_spac:
            string.replace(c, ' ')
        print(' '.join(string.split()[::-1]))
except:
    pass
           

字符串合并处理

题目描述

按照指定规则对输入的字符串进行处理。

详细描述:

将输入的两个字符串合并。

对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。

对排序后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符。如字符为‘4’,为0100b,则翻转后为0010b,也就是2。转换后的字符为‘2’; 如字符为‘7’,为0111b,则翻转后为1110b,也就是e。转换后的字符为大写‘E’。

举例:输入str1为"dec",str2为"fab",合并为“decfab”,分别对“dca”和“efb”进行排序,排序后为“abcedf”,转换后为“5D37BF”

接口设计及说明:

void ProcessString(char* str1,char *str2,char * strOutput)

{

}

输入描述:

输入两个字符串

输出描述:

输出转化后的结果

示例1

输入

dec fab
           

输出

5D37BF
           
try:
    while True:
        string = input().replace(" ", "")
        dic = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
        r_str = ""
        l_str = ""
        final_str = ""
        for i in range(len(string)):
            if i % 2 == 0:
                r_str += string[i]
            else:
                l_str += string[i]
        r_str = "".join(sorted(r_str))
        l_str = "".join(sorted(l_str))
        for i in range(len(r_str)):
            c = r_str[i]
            if c in "0123456789abcdefABCDEF":
                final_str += dic[int(bin(dic.index(c.upper())).replace("0b", "").rjust(4, "0")[::-1], 2)]
            else:
                final_str += c
            if len(l_str) != i:
                c = l_str[i]
                if c in "0123456789abcdefABCDEF":
                    final_str += dic[int(bin(dic.index(c.upper())).replace("0b", "").rjust(4, "0")[::-1], 2)]
                else:
                    final_str += c
        print(final_str)
except:
    pass
           

字符串加解密

题目描述

1、对输入的字符串进行加解密,并输出。

2加密方法为:

当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;

当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;

其他字符不做变化。

3、解密方法为加密的逆过程。

接口描述:

    实现接口,每个接口实现1个基本操作:

void Encrypt (char aucPassword[], char aucResult[]):在该函数中实现字符串加密并输出

说明:

1、字符串以\0结尾。

2、字符串最长100个字符。

int unEncrypt (char result[], char password[]):在该函数中实现字符串解密并输出

说明:

1、字符串以\0结尾。

 2、字符串最长100个字符。

输入描述:

输入说明

输入一串要加密的密码

输入一串加过密的密码

输出描述:

输出说明

输出加密后的字符

输出解密后的字符

示例1

输入

abcdefg

BCDEFGH

输出

BCDEFGH

abcdefg

余数说明:https://www.cnblogs.com/hylogs/p/12822870.html

python解法:

def encodeAndDecode(string, mode):
    res = ""
    for i in string:
        code = ord(i)
        if 48 <= code <= 57:  # 数字
            res += chr(48 + (code - 48 + mode) % 10)
        elif  97 <= code <= 122:  # 小写字母
            res += chr(65 + (code - 97 + mode) % 26)
        elif  65 <= code <= 90:  # 大写字母
            res += chr(97 + (code - 65 + mode) % 26)
        else:
            res += i
    return res
 
 
try:
    while True:
        print(encodeAndDecode(input(), 1))
        print(encodeAndDecode(input(), -1))
except:
    pass
           

字符串加密 

题目描述

有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如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。

请实现下述接口,通过指定的密匙和明文得到密文。

详细描述:

接口说明

原型:

voidencrypt(char * key,char * data,char * encrypt);

输入参数:

char * key:密匙

char * data:明文

输出参数:

char * encrypt:密文

返回值:

void

输入描述:

先输入key和要加密的字符串
           

输出描述:

返回加密后的字符串
           

示例1

输入

nihao
ni
           

输出

le
           

 解法1:

while True:
    try:
        dd = {'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':''}
        real_str, encrypt = '', ''
        key, data = input(), input()
        string = key.upper() + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        for c in string:
            if c not in real_str:
                real_str += c
        for i in range(26):
            dd[chr(65 + i)] = real_str[i]
        for c in data:
            if c.isupper():
                encrypt += dd[c]
            elif c.islower():
                encrypt += dd[c.upper()].lower()
            else:
                encrypt += c
        print(encrypt)
    except:
        break
           

 解法2:

while True:
    try:
        #key,string分别代表输入的key的加要密的字符串
        #chars是密钥对应的字母表,res是要返回的结果。
        key, string, chars, res = input(), input(), [], ""
        #经过下面的循环,chars前面几个是密匙的字母
        for i in key:
            if i not in chars:
                chars.append(i)
        #如果输入的key中有小写字母,转为大写字母。
        chars = list(map(lambda c: c.upper(), chars))
        #剩下的字母,填充到chars里面。
        for i in range(65, 91):
            if chr(i) not in chars:
                chars.append(chr(i))
        # 将输入加密。
        for i in string:
            if i.isupper():
                res += chars[ord(i) - 65]
            elif i.islower():
                res += chars[ord(i) - 97].lower()
            else:
                res += i
        print(res)
 
    except:
        break
           

字符串通配符

题目描述

问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。

要求:

实现如下2个通配符:

*:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)

?:匹配1个字符

输入:

通配符表达式;

一组字符串。

输出:

返回匹配的结果,正确输出true,错误输出false

输入描述:

先输入一个带有通配符的字符串,再输入一个需要匹配的字符串

输出描述:

返回匹配的结果,正确输出true,错误输出false

示例1

输入

te?t*.*
txt12.xls      

输出

false      

解法

import re
while True:
    try:
        a,b = input().strip(),input().strip()
        a = a.replace("?","\w{1}").replace(".","\.").replace("*","\w*")
        c = re.findall(a,b)
        if b in c and len(c) == 1:
            print("true")
        else:
            print("false")
    except:
        break