• 华为笔试


    1、字符串重排

    时间限制:C/C++ 1秒,其他语言 2s  空间限制:C/C++ 32768K,其他语言 65536K

    题目描述

    给你一个原始字符串,根据该字符串内每个字符出现的次数,按照ASCII码递增顺序重新调整输出。举例!假设原始字符串为:eeefgghhh

    则每种字符串出现的次数分别是:(1)eee  3次;(2)f  1次;(3)gg  2次;(4)hhh  3次;

    重排输出后的字符串如下:efghegheh

    编写程序实现上述功能。

    输入描述:eeefgghhh(原始字符串中仅可能出现数字和字母,请注意区分字母大小写)

    输出描述:efghegheh

    思路1:通过字典的方式存储字符串每个字符出现的次数,并按ASCII码递增顺序对字典进行排序。然后依次遍历字典,

    使用setdefault()方法创建字典,setdefault()方法语法:

    dict.setdefault(key, default=None)
    

     参数:key -- 查找的键值。

        default -- 键不存在时,设置的默认键值。

    返回值:如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值

    class Solution:
        def rearrange_string(self, string):
            if not string:
                return None
            char_count = {}
            for char in string:
                char_count.setdefault(char, 0)
                char_count[char] += 1
            char_count = sorted(char_count.items(), key=lambda x: x[0])
            res = ''
            while char_count:
                index = 0
                while index < len(char_count):
                    val = char_count[index]
                    if val[1] > 1:
                        res += val[0]
                        char_count[index] = (val[0], val[1] - 1])
                        index += 1
                    elif val[1] == 1:
                        res += val[0]
                        del char_count[index]
                    else:
                        del char_count[index]
            return res
    
    if __name__ == "__main__":
        import sys
        while True:
            try:
                string = sys.stdin.readline().strip()
                print(Solution().rearrange_string(string))
            except:
                break

    思路2:(1)将字符串去重并按ASCII码递增顺序进行排序存入char列表;

    (2)用count列表存储对应字符出现的次数;

    (3)通过zip将两张列表压缩并转为字典;

    (4)通过char*maxCount重复遍历char列表,如果对应的count大于0则将该字符存入res,并进行count-1。

    class Solution:
        def rearrange_string(self,string):
            if not string:
                return None
            char=list(sorted(set(string)))
            count=[]
            for c in char:
                count.append(string.count(c))
            char_count=dict(zip(char,count))
            maxCount=max(count)
            res=''
            for i in char*maxCount:
                if char_count[i]>0:
                    res+=i
                    char_count[i]-=1
                else:
                    continue
            return res
    
    if __name__=='__main__':
        while True:
            try:
                string=input()
                print(Solution().rearrange_string(string))
            except:
                break

      

    2、跳跃比赛

    时间限制:C/C++1秒,其他语言2秒     空间限制;C/++32768k,其他语言:65536K

    题目描述

    给出一组正整数,你从第一个数向最后一个数跳跃,每次至少跳跃一格,每个数的值表示你从这个位置可以跳跃的最大长度。计算如何以最小的跳跃次数跳到最后一个数。

    输入描述:第一行表示有多少个数n,第二行开始依次是1到n个数,一个数一行

    输出描述:输出一行,表示至少跳跃的次数

    示例1

    输入:

    7

    2

    3

    2

    1

    2

    1

    5

    输出:

    3

    说明:7表示接下来要输入7个正整数,从2开始。数字本身代表可以跳跃的最大步长,此时有2种跳法,为2-2-2-5和2-3-2--5都为3步

    思路1;

    class Solution:
        def min_hops(self, steps):
            if not steps or len(steps) == 1:
                return 0
            cache = [0] * len(steps)
            cache[0] = 0
    
            arr_one_hop = [[] for i in range(len(steps))]
            for index, val in enumerate(steps):
                hop_floor = min(index + val, len(steps) - 1)
                for pos in range(index + 1, hop_floor + 1):
                    arr_one_hop[pos].append(index)
    
    
            for index in range(1, len(steps)):
                all_hops = []
                while arr_one_hop[index]:
                    all_hops.append(1+cache[arr_one_hop[index].pop()])
                cache[index] = min(all_hops)
            return cache[len(steps) - 1]
    
    if __name__=='__main__':
        while True:
            try:
                n = int(input())
                steps = [int(input()) for _ in range(n)]
                print(Solution().min_hops(steps))
            except:
                break

    3、大数相乘

    时间限制:C/C++1秒,其他语言2秒     空间限制;C/++32768k,其他语言:65536K

    题目描述

    编写“长整数相乘”程序,实现两个任意长度的长整数(正数)相乘,输出结果

    输入描述:第一行输入数字A的字符串,字符范围(0-9),第二行输入数字B的字符串,字符范围(0-9)

    输出描述:输出字符A、B两数相乘的结果,结果为字符串。

    示例1:

    输入:

    1234

    4321

    输出:

    5332114

    说明

    第一排数字*第二排数字

  • 相关阅读:
    用List绑定GridView的简单辅助类
    宋忠玲(帮读者名字作诗)
    [转帖]每天看一遍,释怀所有难过
    30岁,我们怎么赢?
    柴门远望
    创业,不要被那些成功人士所忽悠
    一只海燕飞过来
    成功者都在用的“成功咒语”
    诗歌复兴
    游熊猫基地有感
  • 原文地址:https://www.cnblogs.com/hester-tang/p/8797047.html
Copyright © 2020-2023  润新知