技术笔试刷题笔记-3

1. 字符串排序

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

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

如,输入: Type 输出: epTy

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

如,输入: BabA 输出: aABb

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


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


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

while True:
    try:
        string = str(input())
        target_range = set( range(ord("a"), ord("z")+1) )
        target_range = target_range.union( set(range(ord("A"), ord("Z")+1) ) )
        ls = []
        [ls.append(s) if ord(s) in target_range else "" for s in string ]

        ls_new = []
        for ind in range(ord("a"), ord("z")+1):
            for s in ls:
                if ord(s) == ind or ord(s) == ind + ord("A")-ord("a"):
                    ls_new.append(s)
                    # ls.remove(s)
                    continue

        ls_output = []
        for s in string:
            if ord(string[len(ls_output)]) not in target_range:
                ls_output.append(string[len(ls_output)])

                continue
            elif ord(string[len(ls_output)]) in target_range:
                ls_output.append(ls_new[0])
                ls_new.pop(0)
        string_o = "".join(ls_output)
        print(string_o)
        pass
    except:
        break

2. 字符串加解密

  • 题目描述
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个字符。

 
  • 代码:
def _encode(s):
    if ord("a") <= ord(s) < ord("z"):
        return chr( ord(s) + 1 + ord("A") - ord("a") )
    elif ord(s) == ord("z"):
        return "A"

    elif ord(s) == ord("Z"):
        return "a"
    elif ord("A") <= ord(s) < ord("Z"):
        return chr( ord(s) + 1 + ord("a") - ord("A") )

    elif ord("0") <= ord(s) < ord("9"):
        return chr( ord(s) + 1  )
    elif ord(s) == ord("9"):
        return "0"

    else:
        return s



def encode(string):
    string = "".join([_encode(s) for s in string])
    return string



def _decode(s):
    if ord("a") < ord(s) <= ord("z"):#ok
        return chr( ord(s) - 1 + ord("A") - ord("a") )
    elif ord(s) == ord("A"):#ok
        return "z"

    elif ord(s) == ord("a"):#ok
        return "Z"
    elif ord("A") < ord(s) <= ord("Z"):#ok
        return chr( ord(s) - 1 + ord("a") - ord("A") )

    elif ord("0") < ord(s) <= ord("9"):#ok
        return chr( ord(s) - 1  )
    elif ord(s) == ord("0"):#ok
        return "9"

    else:
        return s



def decode(string):
    string = "".join([_decode(s) for s in string])
    return string


while True:
    try:
        str1 = str(input())
        str2 = str(input())
        print(encode(str1))
        print(decode(str2))
        
        pass
    except:
        break

3. 数据分类处理

  • 题目描述
    信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。
    采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出。

  • 代码:

while True:
    try:
        str1 = str(input())
        str2 = str(input())
        
        #str1 = "15 123 456 786 453 46 7 5 3 665 453456 745 456 786 453 123"
        #str2 = "5 6 3 6 3 0"
        #str_target = "30 3 6 0 123 3 453 7 3 9 453456 13 453 14 123 6 7 1 456 2 786 4 46 8 665 9 453456 11 456 12 786"

        ls1 = str1.split(" ")
        n1, ls1 = ls1[0], ls1[1: ]
        ls1 = ls1[:int(n1)]

        ls2 = str2.split(" ")
        n2, ls2 = ls2[0], ls2[1:]
        ls2 = ls2[:int(n2)]

        ls2 = list(set(ls2))
        ls2 = [int(item) for item in ls2]
        ls2.sort()
        ls2 = [str(item) for item in ls2]

        dic_result = dict()
        for key in ls2:
            _sub_result = []
            [_sub_result.append( (str(ind),item) ) if key in item else None   for ind,item in enumerate(ls1)]
            dic_result[key] = _sub_result

        ls_output = []
        for key in dic_result.keys():
            if len(dic_result[key])>0:
                ls_output.append(key)
                ls_output.append( str(len(dic_result[key])) )
                ls_output.extend([_item  for _tup in dic_result[key] for _item in _tup ])
        print(str(len(ls_output)) + " " + " ".join(ls_output))
        #print(str_target)
        pass
    except:
        break

4. 蛇形矩阵

  • 题目描述
题目说明

蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

 

 

 

样例输入

5

样例输出

1 3 6 10 15

2 5 9 14

4 8 13

7 12

11

接口说明

原型

void GetResult(int Num, char * pResult);

输入参数:

        int Num:输入的正整数N

输出参数:

        int * pResult:指向存放蛇形矩阵的字符串指针

        指针指向的内存区域保证有效

返回值:

        void
  • 代码:
while True:
    try:
        num = int(input())
        #num = 4
        ls = [[0]*num for i in range(num)]
        _x,_y = 0,0
        value = 1
        for i in range(num):
            _x,_y = i,0
            while _x >= 0:
                ls[_x][_y] = value

                value += 1
                _x -= 1
                _y += 1

        ls = [ " ".join([str(val) if val >0 else ""  for val in _ls ]) for _ls in ls ]
        ls = [item.strip(" ") for item in ls]
        [print(item) for item in ls]
        
        
        pass
    except:
        break

5. 汽水瓶

  • 题目描述
    有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

  • 代码:

while True:
    
    try:
        num = int(input())
        n = 0
        if num == 0:
            break
        else:
            while num >=2 :
                num -= 3 # 消耗三瓶饮料
                num += 1 # 得到一瓶饮料
                n += 1
            print(n)
        pass
    except:
        break

6. 删除字符串中出现次数最少的字符

  • 题目描述
    实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
    注意每个输入文件有多组输入,即多个字符串用回车隔开

  • 代码:

while True:
    try:
        #string = "abcdd"
        string = str(input())
        dic = dict([(key,0) for key in set(string)])
        for key in string:
            dic[key] += 1
        count_min = min(dic.values())
        ls_min = []
        [ls_min.append(key) if dic[key]!=count_min else None for key in string]
        print("".join(ls_min))


        pass
    except:
        break

7. 简单密码

  • 题目描述
    密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。

    假设渊子原来一个BBS上的密码为zvbo9441987,为了方便记忆,他通过一种算法把这个密码变换成YUANzhi1987,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。

    他是这么变换的,大家都知道手机上的字母: 1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,就这么简单,渊子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,

    声明:密码中没有空格,而密码中出现的大写字母则变成小写之后往后移一位,如:X,先变成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。

  • 代码:

def _transfer(s):
    if ord("A") <= ord(s) < ord("Z"):
        return chr(1 + ord(s) + ord("a") - ord("A"))
    elif s=="Z":
        return "a"

    elif ord("a") <= ord(s) <= ord("z"):
        dic = {
     "1":1,
               "a":2, "b":2, "c":2,
               "d":3, "e":3, "f":3,
               "g":4, "h":4, "i":4,
               "j":5, "k":5, "l":5,
               "m":6, "n":6, "o":6,
               "p":7, "q":7, "r":7, "s":7,
               "t":8, "u":8, "v":8,
               "w":9, "x":9, "y":9, "z":9,
               "0":0,
              }

        return str(dic[s])
    elif ord("0") <= ord(s) <= ord("9"):
        return s
    else:
        return s
    
    
while True:
    try:
        #code_in = "YUANzhi1987"
        #code_out = "zvbo9441987"
        code_in = str(input())
        code_o = "".join([_transfer(s) for s in code_in])
        print(code_o)
        pass
    except:
        break

8. 密码验证合格程序

  • 题目描述

    密码要求:
    1.长度超过8位
    2.包括大小写字母.数字.其它符号,以上四种至少三种
    3.不能有相同长度大于2的子串重复
    
  • 代码:

def _check_type(code):
    dic = {
     "a":0, "A":0, "1":0, "other":0}
    for s in code:
        if ord("a") <= ord(s) <= ord("z"):
            dic["a"] += 1
        elif ord("A") <= ord(s) <= ord("Z"):
            dic["A"] += 1
        elif ord("0") <= ord(s) <= ord("9"):
            dic["1"] += 1
        else:
            dic["other"] += 1
    count_type = 0 # 统计类别数量为0的 类别的数量
    for k,v in dic.items():
        if v == 0:
            count_type += 1
    if count_type <= 1:
        return "effect"
    else:
        return "not_effect"

def __slice(string, window):
    """
    滑动窗口切片
    计算给定窗口大小window下,string中所有可能的序列
    """
    result_list = []
    for i in range(0, len(string)-window+1):
        result_list.append(string[i:i+window])
    return result_list

def _check_repeat_slice(string):
    result_list = []
    for w in range(3, len(string)-1):
        result_list += __slice(string, w)

    dic_stat = dict()
    for item in result_list:
        if item in dic_stat.keys():
            dic_stat[item] += 1
        else:
            dic_stat[item] = 1

    #print(result_list)
    #print(dic_stat)
    if max(dic_stat.values())>=2:
        return "not_effect"
    else:
        return "effect"



def check_effect(code):
    if len(code) <= 8:
        return "NG"
    if _check_type(code) == "not_effect":
        return "NG"
    if _check_repeat_slice(code) == "not_effect":
        return "NG"

    return "OK"







while True:
    try:
        code = str(input())
        print(check_effect(code))
        pass
    except:
        break
        


#%%

你可能感兴趣的:(leetdoce)