Python的初级题目

某个人进入如下一个棋盘中,要求从左上角开始走,
    最后从右下角出来(要求只能前进,不能后退),
    问题:共有多少种走法?

    0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0

这是一个八行五列的棋盘

n = 8
m = 5
def dfs(i, j):
    if i == n - 1 and j == m - 1:
        return 1
    if i < 0 or j < 0 or i >= n or j >= m:
        return 0
    return dfs(i + 1, j) + dfs(i, j + 1)

print(dfs(0, 0))

这里使用到了函数的递归,我们先进行俩个判断,1.不是最后一个 2.判断有没有越界

他们是一个从列走,一个从行走,其累计的值就是总的

结果是330

   输入一行符号,以#结束,判断其中的对称符号是否匹配。

对称符号包括:
    { } 、 [ ] 、 ( )、 < >

    如果对称符号能够实现中间对称,则输出yes
    否则输出no

def is_match(s):
    stack = []#定义一个空栈
    for c in s:#将输入的值一个一个拿出来
        if c == '{' or c == '[' or c == '(' or c == '<':
            stack.append(c)#插入到空栈里面
        elif c == '}' or c == ']' or c == ')' or c == '>':
            if len(stack) == 0:#判断插入的栈是不是空
                return False
            top = stack.pop()
            if (c == '}' and top == '{') or (c == ']' and top == '[') or (c == ')' and top == '(') or (c == '>' and top == '<'):
                continue
            else:
                return False
    return len(stack) == 0

if __name__ == '__main__':
    s = input()
    if is_match(s):
        print('yes')
    else:
        print('no')

这里我们运用到栈,先判断输入一个数量可以整除2的符号串,利用栈先进先出的规则和列表的字符串进行比较(弹栈的方法)

给定一个包含n+1个整数的数组nums,其数字在1到n之间(包含1和n),
可知至少存在一个重复的整数,假设只有一个重复的整数。
请找出这个重复的数

def find_duplicate(nums):
    n = len(nums)
    hash_map = {}
    for i in range(n):
        if nums[i] in hash_map:
            return nums[i]
        else:
            hash_map[nums[i]] = True
    return -1

if __name__ == '__main__':
    nums = [1,1, 2,2,2, 3, 4, 5, 5]
    print(find_duplicate(nums))

这里我们用字典和return -1 来帮助我们求重复值,当某个值已经重复的时候就会return 出来,但是这里,问你用到的递归的方法,只有次数重复最长的数字会被反回,如果有相同重复次数的,则反回先重复的数字,return -1 表示有重复的值,注意字典是一个key和Value是一对值,

读入学生成绩,获取最高分best,然后根据下面的规则赋等级值:

(1)如果分数≥best-10,等级为A
(1)如果分数≥best-20,等级为B
(1)如果分数≥best-30,等级为C
(1)如果分数≥best-40,等级为D
(1)其他情况,等级为F
**输入输出描述**
输入两行,第一行输入学生人数n,第二行输入n个学生的成绩
输入n行,表示每个学生的成绩等级
**示例**
> 输入:
>
> 4
>
> 40 55 70 58
>
> 输出:
>
> 学生0分数为40,等级为C
>
> 学生1分数为55,等级为B
>
> 学生2分数为70,等级为A
>
> 学生3分数为58,等级为B

这里方法很多,可以不断用elif,

 for i in range(n):
        score = scores[i]
        if score >= best - 10:
            grade = 'A'
        elif score >= best - 20:
            grade = 'B'
        elif score >= best - 30:
            grade = 'C'
        elif score >= best - 40:
            grade = 'D'
        else:
            grade = 'F'
        grades.append(grade)
    return grades

## Demo62 计算数字的出现次数

**题目描述**

读取1到100之间的整数,然后计算每个数出现的次数

**输入输出描述**

输入两行,第一行为整数的个数n,第二行为n个整数

输出多行,每行表示某数及其出现的次数,顺序按照数字从小到大

这里和前面的求重复有差不多的方法

 if number in occurrences:
            occurrences[number] += 1
        else:
            occurrences[number] = 1

加上计算器就可以了

## Demo63 打印不同的数

**题目描述**

读入n个数字,并显示互不相同的数(即一个数出现多次,但仅显示一次),数组包含的都是不同的数

**输入输出描述**

输入两行,第一行为数字的个数n,第二行为n个数字

输出数组,包含的都是不同的数

**示例**

> 输入:
>
> 10
>
> 1 2 3 2 1 6 3 4 5 2
>
> 输出:
>
> 1 2 3 6 4 5

用哈希表就可以了,再遍历哈希表,看看是否重复,这里用“ () ”

我就不多赘述

**题目描述**

输入n个数字,求该n个数字的最大公约数

**输入输出描述**

输入两行,第一行为数字个数n,第二行为n个整数

输出最大公约数

**示例**

> 输入:
>
> 9 12 18 21 15
>
> 输出:
>
> 3

def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

def find_gcd(numbers):
    n = len(numbers)
    result = numbers[0]
    for i in range(1, n):
        result = gcd(result, numbers[i])

第一个函数gcd,我们来进行求约数

我们很巧妙的运用了

while b!=0

a,b = b,a%b判断公约数

第二个函数进行两两比较,不断覆写result值,求出最大的公约数

## Demo65 打乱数组

**题目描述**

编程程序,对给定的数组进行随机打乱,并输出打乱后的结果

def shuffle_array(nums):
    random.shuffle(nums)
    return nums

运用random模块进行随机方法   .shuffle()  进行打乱

## Demo67 相似词

**题目描述**

输入两个英文单词,判断其是否为相似词,所谓相似词是指两个单词包含相同的字母

**输入输出描述**

输入两行,分别表示两个单词

输出结果,为相似词输出YES,否则输出NO

**示例**

> 输入:
>
> listen
>
> silent
>
> 输出:
>
> YES

                                        直接让俩个字母列表进行字母顺序排序,一样就行

豆机器,也称为梅花或高尔顿盒子,它是一个统计实验的设备,
它是由一个三角形直立板和均匀分布的钉子构成,

小球从板子的开口处落下,每次小球碰到钉子,
它就是50%的可能掉到左边或者右边,
最终小球就堆积在板子底部的槽内

编程程序模拟豆机器,提示用户输入小球的个数以及机器的槽数,
打印每个球的路径模拟它的下落,然后打印每个槽子中小球的个数

**输入输出描述**

输入两个数据,分别表示小球个数和槽子的个数

输出每个小球经过的路径,和最终每个槽子里小球的个数
(因为牵扯随机数,程序结果不唯一,示例仅用于表明题意)

**示例**

> 输入:
>
> 5 8
>
> 输出:
>
> LRLRLRR
>
> RRLLLRR
>
> LLRLLRR
>
> RRLLLLL
>
> LRLRRLR
>
> 0 0 1 1 3 0 0 0

def simulate_bean_machine(ball_count, slot_count):
    slots = [0] * slot_count
    paths = []
    
    for _ in range(ball_count):
        path = ""
        position = 0
        
        for _ in range(slot_count - 1):
            direction = random.choice(["L", "R"])
            path += direction
            
            if direction == "R":
                position += 1
        
        slots[position] += 1
        paths.append(path)
    
    return paths, slots

我们首先定义了一个函数 simulate_bean_machine ,该函数接受小球个数和槽子个数作为输入,并返回小球的路径和最终每个槽子中小球的个数。在函数中,我们使用一个列表 slots 来表示每个槽子中小球的个数,初始化为全零。然后,我们进行小球模拟的循环,每次模拟一个小球的路径。在小球的路径模拟中,我们使用 random.choice 函数随机选择小球下落的方向,并根据方向更新小球的位置和路径。最后,我们将小球的路径添加到路径列表 paths 中,并根据小球的最终位置更新槽子中小球的个数。最后,我们返回路径列表和槽子列表。

一个学校有100个更衣室和100个学生。
所有的更衣室在开学第一天都是锁着的。随着学生进入,
第一个学生表示为S1,打开每个更衣室;然后第二个学生S2,
从第二个更衣室开始,用L2表示,关闭所有其他更衣室;
学生S3从第三个更衣室L3开始,
改变每三个更衣室(如果打开则关闭,如果关闭则打开);
学生S4从更衣室L4开始,改变每四个更衣室;
学生S5开始从更衣室L5开始,改变每五个更衣室。
依次类推,直到学生S100改变L100。

在所有学生都经过了操作后,哪些更衣室是打开的?编程找出答案

这是一个很有意思的数学题,我们可以知每个门的状态是0,1开关,这里我们到第三间的时候会改变对应数字的数量的间隔的门的状态

a1=开

a2=开时,a1=关

有a3=开,a2=关。。。。

我们就可以

def simulate_lockers():
    lockers = [False] * 100

    for student in range(1, 101):
        for locker in range(student, 101, student):
            lockers[locker - 1] = not lockers[locker - 1]

    open_lockers = [i + 1 for i, locker in enumerate(lockers) if locker]
    return open_lockers

**题目描述**

给定两个有序递增的数组A和数组B,将其进行合并成一个新的数组C,
且保持有序递增,并输出数组C

**输入输出描述**

第一行输入数组A的长度n,第二行输入n个元素,
第三行输入数组B的长度m,第四行输入m个元素

输出数组C的n+m个元素

**示例**

> 输入:
>
> 5
>
> 1 5 16 61 111
>
> 4
>
> 2 4 5 6
>
> 输出:
>
> 1 2 4 5 5 6 16 61 111

这里我们可以就将两个数组的数比较c数组内的数,放入对应位置

    merged_array = []
    i, j = 0, 0
    len_a, len_b = len(array_a), len(array_b)

    while i < len_a and j < len_b:
        if array_a[i] <= array_b[j]:
            merged_array.append(array_a[i])
            i += 1
        else:
            merged_array.append(array_b[j])
            j += 1

    while i < len_a:
        merged_array.append(array_a[i])
        i += 1

    while j < len_b:
        merged_array.append(array_b[j])
        j += 1

这里我使用较多的变量使得过程清晰一些

给定一个数组A,将第一个元素$A_0$作为枢纽,
并把数组划分成三个区间,第一个区间所有元素$<A_0$,
第二个区间所有元素$==A_0$,第三个区间所有元素$>A_0$

例如数组[5,2,9,3,6,8],划分后的结果为[3,2,5,9,6,8],
第一个区间[3,2],第二个区间[5],第三个区间[9,6,8]

结果不唯一,只要保证划分后三个区间的元素特性即可,
[2,3,5,9,8,6]、[3,2,5,6,8,9]都可作为上述划分

这个有点类似于c语言里面的插入排序,存在一个“哨兵”的感觉,只不过这里面的哨兵不会改变

def partition_array(nums):
    pivot = nums[0]  # 选择第一个元素作为枢纽
    i = 0  # i指向第一个区间的末尾
    j = 0  # j指向第二个区间的末尾

    for k in range(1, len(nums)):
        if nums[k] < pivot:  # 小于枢纽的元素放入第一个区间
            nums[k], nums[i] = nums[i], nums[k]
            i += 1
            j += 1
        elif nums[k] == pivot:  # 等于枢纽的元素放入第二个区间
            nums[k], nums[j] = nums[j], nums[k]
            j += 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值