第一次测试题笔记(2020.11.9)

这篇博客探讨了Python在编程题中的高效应用,包括字符串比较时利用Python内置函数简化代码,处理小数点问题时注意边界条件,以及如何通过递归和动态规划解决数学问题。对于递归函数,博主指出了未优化的递归可能导致超时,并展示了如何通过动态规划避免重复计算以提高效率。
摘要由CSDN通过智能技术生成

最近写了一些编程题准备做一些笔记方便以后复习

1.字符串判等
题目描述
给定两个大小写字母、空格组成的字符串S1和S2,
他们的长度都不超过100个字符,长度也可以为零。
判断压缩掉空格并且忽略掉大小写后,这两个字符是否相等

输入
输入两行数据,两个字符串

输出
如果根据判定条件相等,则输出:YES!
否则输出:NO!

样例输入

 S  h i C H aO
 s H I ch A o

样例输出

YES!

之前的思路,通过两字符串的字符一个一个比(因为c语言写多了就直接想到了这个思路)但是这样我为啥要用Python,用Python他的自带函数不香嘛。

ls = input().split(" ")
ls1 = input().split(" ")
st = ''.join(ls)
st1 = ''.join(ls1)
if len(st) != len(st1):
    print("NO!")
else:
    flag = 1
    for i in range(len(st)):
        if abs(ord(st[i])-ord(st1[i])) != ord('a')-ord('A') and abs(ord(st[i])-ord(st1[i]))!=0  :
            print("NO!")
            flag = 0
            break
    if flag:
        print("YES!")

改进:

ls = input().lower().split(" ")
st =''.join(ls)
ls1 = input().lower().split(" ")
st1 = ''.join(ls1)
if len(st) !=len(st1):
    print('NO!')
else:
    if st == st1:
        print('YES!')
    else:
        print('NO!')

因为它忽略掉大小写,那将其全部转化为小写,然后直接比较就好了,这样发现Python真香。

2.讨厌的小数点

题目描述
小明一直很讨厌小数点,一看到小数点就头疼。不幸的是,小红给他出了一个题目,问他:
给你一个小数x,你能算出小数点后第n位是什么吗?(1<=n<=6)
小明看到此题后,瞬间头疼晕倒,你能帮帮他吗?

输入
首先输入一个t,表示有t组数据,跟着t行:
每行输入一个小数(输入数据保证一定是a.b的形式,为了简单化问题,没有循环小数的情况),然后跟一个n,表示小数点后第几位。

输出
输出一个数表示小数点后第n位的数。

样例输入

3
1.234 1
2.345 2
3.456 3

样例输出

2
4
6

这个题有一个坑,就是如果输入n, 而小数点后第 n 位没没有的话,那么就输出 0,就是这个坑,这种题目老是想的不全面。
代码

#include<bits/stdc++.h>
#define N 200
using namespace std;
int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        char ch[N];
        int b, j = 0;
        cin >> ch >> b;
        while (ch[j++] != '.');
        if (j + b > strlen(ch))
            printf("0\n");
        else
            printf("%c\n", ch[j + b - 1]);
    }
    return 0;
}

3.二的幂次方
题目描述
任何一个正整数都可以用2的幂次方表示。例如:137=2^7 + 2^3 + 2^0 同时约定用括号来表示方次,即a^b可以表示为a(b)。由此可知,137可以表示为:2(7)+2(3)+2(0) 进一步:7=2^2 + 2 + 2^0 ;3=2+2^0
所以最后127可以表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0) (n<=20000)

样例输入

137

样例输出

2(2(2)+2+2(0))+2(2+2(0))+2(0) 

这题应该很容易就想到要用到递归吗,然后你写一个递归函数,不管你的递归函数是否已经写好,你一定要认为这个函数已经实现了,这样你就可以安心在这个函数里调用他自己了。

def back(num):
    if num <= 1:
        return
    st = str(bin(num)).replace("0b","")
    index = []
    #print(st)
    for i in range(len(st)):
        if st[len(st)-i-1] == '1':
            #print(st[len(st) - i - 1])
            index.append(i)
    index.sort(reverse=True)
    #print()  # 7  1 1 1
    for i in range(len(index)):
        print("2", end='')
        if index[i] == 2:
            print("(2", end='')
        elif index[i] == 1:
            print("", end='')
        elif index[i] == 0:
            print("(0", end='')
        else:
            print("(",end='')
            back(index[i])
        if index[i]!=1:
            print(")", end='')
        if i != len(index)-1:
            print("+", end='')
n = int(input())
back(n)

4.递归函数
题目描述
考虑如下的3参数递归函数w(a,b,c);
如果a≤0或b≤0或c≤0,则w(a,b,c)=1;
如果a>20或b>20或c>20,则w(a,b,c)=w(20,20,20);
如果a其他情况下:w(a,b,c)=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1, b-1,c-1)。
设计一个程序,快速计算w(a,b,c)并给出结果。

输入
1行整数,包含3个数值,分别对应a、b和c的值。

输出
一个数,即w(a,b,c)的结果。

样例输入

1 1 1
50 50 50

样例输出

2
1048576

这题很明显就是一道递归题,然后我们就很自然的写出这样的代码。但是一提交它就超时了。

#include<bits/stdc++.h>
using namespace std;
int w(int a, int b, int c)
{
    if (a <= 0 || b <= 0 || c <= 0)
        return 1;
    else if (a > 20 || b > 20 || c > 20)
        return 1048576;
    else
        return w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
}
int main()
{
    int a, b, c;
    while (scanf("%d%d%d", &a, &b, &c) != EOF)
        printf("%d\n", w(a, b, c));
    return 0;
}

所以在这要引入动态规划来提高递归的效率,简单的说就是把每次递归的值保存到一个数组中,这样如果在递归中递归同样的数字就不需要再递归下去了,可以直接使用已经保存在数组中的值。

#include<bits/stdc++.h>
using namespace std;
int f[21][21][21];
int a, b, c;
int w(int a, int b, int c)
{
    if (a <= 0 || b <= 0 || c <= 0)
        return 1;
    else if (a > 20 || b > 20 || c > 20)
        return w(20, 20, 20);
    else if (f[a][b][c])
        return f[a][b][c];
    else
        f[a][b][c] = w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
    return f[a][b][c];
}
int main()
{
    while (scanf("%d%d%d", &a, &b, &c) != EOF)
        printf("%d\n", w(a, b, c));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值