蓝桥杯-基础题python

蓝桥杯基础题题库连接:点我
需要题目的可以到题库里面去看看,或者直接在百度搜索题目名称

参加比赛的一些心得:感觉把比赛得那一门语言基础学会,输入输出(我写的python输入输出),(C++的STL),熟练里面的数据结构,如数组,map等,主要还是基础。熟悉了后,可以在刷一下基础题,巩固哈学了的基础知识。把基础学好了,拿个奖是没问题的,正常发挥即可。想那个好的名词,就要看看相关的算法了,主要就是暴力的+优化,BFS,DFS,比较难的就是动态规划,得找转换方程。下面是当时参加比赛看的一些博客的链接,可参考:
蓝桥杯往年常考算法心得_蓝桥杯必考算法_不加冰可乐的博客-CSDN博客
蓝桥杯(简单算法模板)_蓝桥杯比赛电脑上可以存算法模版嘛_XDIGAS的博客-CSDN博客
蓝桥杯知识点总结【预备2020蓝桥杯】_Tanzq-blog的博客-CSDN博客
蓝桥杯及其搜索算法总结_蓝桥杯搜索算法_zhejiangjjw的博客-CSDN博客
蓝桥杯常用算法汇总_蓝桥杯必备算法_summerone123的博客-CSDN博客

0 python自带编译器使用

  • 自动补全代码: Alt+/
  • 加缩进: Ctrl+]
  • 减缩进: Ctrl+[
  • 加注释: Alt+3
  • 去注释: Alt+4
  • 调试:
    • 在编辑框右键设置断点(Set Breakpoint)
    • 点击Python Shell中的Debug->Debugger
    • 运行代码,Go运行到下一个断点,step一步一步运行

1 闰年判断

#basic-1 闰年判断
year = int(input())
if (year%4==0 and year%100!=0) or year%400==0:
	#闰年:能被四整除但不能被100整除,或者能被400整除
	print("yes")
else:
	print("no")

2 01字符串

#basic-2 01字符串
#1:0-32转二进制	
for i in range(0, 32):
    res = bin(i)
    res = int(res[2:])
    print("%05d" % res)

#2:直接以二进制输出
for i in range(0,32):
    print("{:05b}".format(i))

3 字母图形

#basic-3 字母图形
# chr(65) - A
#1 (有问题,这样只能row < col才可以)
row, col = map(int, input().split())
for i in range(0, row):
    for j1 in range(0,i):
        print(chr(65 + i - j1), end='')
    for j2 in range(i, col):
        print(chr(65 + j2 - i), end='')
    print()

#2
for i in range(0, row):
    for j in range(0, col):
        a = abs(i-j) #偏移
        print(chr(65 + a), end='')
    print()

4 数列特征

#basic-4 数列特征
n = int(input())
nums = list(map(int, input().split()))
res_sum = 0
res_max = -10001
res_min = 10001
if len(nums) == n:
    for i in range(0, n):
        res_sum += nums[i]
        res_max = max(res_max, nums[i])
        res_min = min(res_min, nums[i])
print(res_max)
print(res_min)
print(res_sum)

5 查找整数

#basic-5 查找整数
#1 调用列表自带函数index()获取出现第一个数字的下标
n = int(input())
nums = list(map(int, input().split()))
target = int(input())
if n == len(nums):
    try:
        #没有该目标的话会出现异常,用try..捕获
        res = nums.index(target)
        print(res + 1)
    except:
        print(-1)
        
#2 循环遍历查找
n = int(input())
nums = list(map(int, input().split()))
target = int(input())
def fun(nums, target):
    for i in range(0, len(nums)):
        if target == nums[i]:
            return i+1
    return -1
if n== len(nums):
    print(fun(nums, target))

6 杨辉三角

#basic-6 杨辉三角
n = int(input())
triangle = [[1],[1,1]]
for i in range(2,n):     #已经给出前两行,所以求剩余行
    cur = [1]            #定义每行第一个元素
    pre = triangle[i-1]  #上一行
    for j in range(i-1): #算几次
        cur.append(pre[j] + pre[j+1])
    cur.append(1)
    triangle.append(cur)
    
for i in range(n):
    for j in range(i+1):
        print(triangle[i][j], end = ' ')
    print()

7 特殊的数字

#basic-7 特殊的数字
for i in range(100, 1000):
    bai = i // 100
    shi = i // 10 % 10
    ge = i % 10
    if i == bai**3 + shi**3 + ge**3:
        print(i)

8 回文数

#basic-8 回文数
for i in range(1000, 10000):
    s = str(i)
    if s[0] == s[-1] and s[1] == s[-2]:
        print(i)

9 特殊回文数

#basic-9 特殊回文数
n = int(input())
sums = 0
for i in range(10000, 1000000):
    s = str(i)
    if (s[0]==s[-1]) and (s[1]==s[-2] and s[2]==s[-3]):
        for ch in s:
            sums += int(ch)
        if sums==n:
            print(i)   
        sums = 0

10 十进制转十六进制

#basic-10 十进制转(十六)进制
#1 除以十六
def _10to16(n, jinzhi = 16):
    if n == 0: return '0'
    res = []
    while n:
        num = n % jinzhi
        n = n // jinzhi
        if num > 9:
            res.append(chr(65 + num - 10))
        else:
            res.append(str(num))
        res = res[::-1]
    return ''.join(res)

n = int(input())  
print(_10to16(n))
#2
res = hex(n)
print(res[2:].upper())

11 十六进制转十进制

#basic-11 (十六)进制转十进制
#1
def _16to10(nstr, jinzhi = 16):
    res = 0
    for ch in nstr:
        if (ch > 'A' or ch == 'A') and (ch < 'Z' or ch == 'Z'):
            res = res*jinzhi + ord(ch) - ord('A') + 10
        else:
            res = res*jinzhi + ord(ch) - ord('0')
    return res
nstr = inpu t()
print(_16to10(nstr))
#2
dec = int(nstr, 16)
print(dec)

12 十六进制转八进制

#basic-12 十六进制转八进制
n = int(input())
while n:
    n = n - 1
    nstr = input()
    dec = int(nstr, 16) #十六进制转十进制
    res = oct(dec)[2:] #十进制转八进制
    print(res)

13 数列排序

#basic-13 数列排序
n = int(input())
nums = list(map(int, input().split()))
#1
nums.sort()
print(nums)

#2 快速排序
def point(nums, left, right, flag=0):
    n1 = nums[right] #选取最后一个作为主元素(可以随机选取,然后放到最右边一个)
    i = left #双指针的左指针,最后用来存n1,若flag=0,则i左边的都小于或等于n1,右边的都大于n1
    for j in range(left, right):
        if flag == 0: #默认升序
            if nums[j] < n1 or nums[j] == n1: #将比n1小或等于的移到左边
                nums[i], nums[j] = nums[j], nums[i]
                i = i + 1
        else:
            if nums[j] > n1 or nums[j] == n1: #将比n1大于或等于的移到左边
                nums[i], nums[j] = nums[j], nums[i]
                i = i + 1
    nums[i], nums[right] = nums[right], nums[i]
    return i;

def quicksort(nums, left, right):
    if left < right: #结束条件
        pos = point(nums, left, right) #找一个点,左边比这个数小,右边比这个数大
        quicksort(nums, left, pos-1) #对左边在排序
        quicksort(nums, pos+1, right) #对右边排序
        
quicksort(nums, 0, len(nums) - 1)
print(nums)

14 时间转换

#basic-14 时间转换
n=int(input())
shi = n // 3600
fen = n % 3600 // 60
miao = n % 60
print('{}:{}:{}'.format(shi, fen, miao))

15 字符串对比

#basic-15 字符串对比
str1 = input()
str2 = input()

if len(str1) != len(str2):
    print(1)
else:
    if str1 == str2:
        print(2)
    elif str1.lower() == str2.lower():
        print(3)
    else:
        print(4)

16 分解质因数

#basic-16 分解质因数
#先从2开始分解,2, 3, 5,7,,,,
def fun(n):
    flag = True
    i = 2
    print('{}='.format(n), end='')
    while n > 1:
        if n % i == 0:
            if flag:
                print(i, end='')
                flag = False
            else:
                print('*{}'.format(i), end='')
    
            n = n // i
        else:
            i += 1
    print()

a, b = map(int, input().split())
for i in range(a, b + 1):
    fun(i)

17 矩阵乘法

#basic-17 矩阵乘法
def mul(arr1, arr2):
    #计算两个矩阵的积
    length = len(arr1)
    res = [[0 for i in range(0, length)] for j in range(0, length)]
    for i in range(0, length):
        for j in range(0, length):
            for k in range(0, length):
                res[i][j] += arr1[i][k]*arr2[k][j]
    return res

def mul_m(arr, m):
    #计算矩阵的m次幂
    res = arr
    for i in range(1, m):
        res = mul(res, arr)
    return res

n, m = map(int, input().split())
arr =[[0 for i in range(0, n)] for j in range(0, n)]
for i in range(0, n):
    arr[i] = list(map(int, input().split()))

#判断m的情况,m为零则为单位矩阵,m为1为原矩阵
if m == 0:
    for i in range(0, n):
        for j in range(0, n):
            if i == j: print(1, end=' ')
            else: print(0, end=' ')
        print()

if m == 1:
    for i in range(0, n):
        for j in range(0, n):
            print(arr[i][j], end=' ')
        print()
else:
    res = mul_m(arr, m)
    for i in range(0, n):
        for j in range(0, n):
            print(res[i][j], end=' ')
        print()

18 矩形相交面积

#basic-18 矩形相交面积
x11, y11, x12, y12 = map(float, input().split())
x21, y21, x22, y22 = map(float, input().split())
#右上角的点
x31 = min(max(x11, x21), max(x12, x22))
y31 = min(max(y11, y21), max(y12, y22))
#左下角的点
x32 = max(min(x12, x22), min(x11, x21))
y32 = max(min(y12, y22), min(y11, y21))

if x31 > x32 and y31 > y32:
    res = (x31 - x32) * (y31 - y32)
    print('%.2f' % res)
else:
    print('0.00')

19 完美代价

#basic-19 完美的代价
#主要思想:因为从两边读要一样,则从两边开始找,固定左边,从右边开始寻找与左边字符相等的,
#然后左指针加1,右指针减一,然后在剩下的字符串中重复以上步骤(要注意出现奇数次的字符)
def fun(s):
    res = 0 #记录结果
    flag = False #用于判断字符串中单个字符为奇数的个数,因为该串中只能有一个出现奇数次的字符
    N = len(s)
    j = N - 1
    for i in range(N):
        #从前往后
        for k in range(j, i - 1, -1):
            #从后往前扫描
            if k == i:
                #扫描到一个出现奇数次的字符,如果原字符串长度为偶数,则直接退出程序
                #否则该字符串为奇数个字符,可以将该字符放到中间构成回文字串,这时将flag置为True
                #如果下次再扫描到一个出现奇数次的字符,也会直接退出程序
                if n % 2 == 0 or flag:
                    print("Impossible")
                    return 0
                flag = True
                #有一个奇数次出现的字符移动的代价,相当于从i位置移动到中间的位置,代价为N // 2 - i
                res = res + N // 2 - i
            elif s[i] == s[k]:
                #找到右边与左边匹配的了,然后从k位置一步一步移到j位置,每移动一次res加1
                for t in range(k, j):
                    res += 1
                    s[t], s[t+1] = s[t+1], s[t]
                j -= 1
                break
    print(res)
    return res

n = int(input())
s = list(input())
res = fun(s)

20 数的读法

#basic-20 数的读法
# https://blog.csdn.net/i6223671/article/details/104395716
#读数分为三种情况:
#为零:正好在万或者亿位上;零连续的情况
#开头为10 万亿
#一般情况:数字+单位
def fun(nums):
    num = ["ling","yi","er","san","si","wu","liu","qi","ba","jiu"] #数字的拼音
    unit = [ "", "", "shi", "bai", "qian", "wan", "shi", "bai", "qian", "yi", "shi"] #单位的拼音

    n = len(nums)
    for i in range(n):
        x = int(nums[i])
        if x == 0:
            if n-i == 5 or n-i == 9:
                # 判断万和亿,在5或者9上面为零,需要将单位读出来
                print(unit[n-i], end=' ')
            if n-i != 1 and nums[i+1] != '0':
                # 判断连续的零,不是最后一个零,且该零后面不为零需要读零出来
                print('ling', end=' ')
        elif (n == 2 or n == 6 or n == 10) and x == 1 and i == 0:
            #1开头(10, 十万,十亿)
            print('shi', end=' ')
        else:
            #一般情况,数字+单位
            print(num[x] + ' ' + unit[n-i], end=' ')

        
n = input()
res = fun(n)

21 Sine之舞

##basic-21 Sine之舞
##先表示An,在表示Sn,主要就是找规律
def An(n):
##    打印An
    for i in range(1, n+1):
        print('sin({}'.format(i), end='')
        if i == n: #打印结束括号
            print(i*')', end='')
        elif i&1: #奇数打印-
            print('-', end='')
        else: #偶数打印+
            print('+', end='')

def Sn(n):
##    打印Sn
    print((n-1)*'(', end='') #打印开始符号
    for i in range(1, n+1):
        An(i)
        #判断是否是最后一个,最后一个不需要右括号
        if i != n:
            print('+{})'.format(n-i+1), end='')
        else:
            print('+{}'.format(n-i+1), end='')
            
n = int(input())
Sn(n)

22 FJ的字符串

#basic-22 FJ的字符串
##假设数字为5,则是数字4对应的字串+E(第五个字符)+数字4对应的字串
##1 循环
def An(n):
    res = ['A']
    temp = []
    for i in range(1, n):
        #两个列表直接赋值,两个列表等价,一个变另外一个也要变
        temp = res.copy() #浅拷贝, 深拷贝在copy库中,new=copy.deepcopy(old)
        res.append(chr(ord('A')+i)) #转成ASCII码加i后在转成字符
        print (temp)
        print (res)
        res = res + temp
    res = ''.join(res) #将列表中字符连接成字符串
    print(res)
##2 递归
def An_r(n):
    if n == 1: #递归结束条件
        print('A', end='')
    else:
        An_r(n-1)#打印该数字前面的字符串
        print(chr(ord('A')+n-1), end='') #打印当前数字的对应的字符
        An_r(n-1)

n = int(input())
An_r(n)

23 芯片测试

#basic-23 芯片测试
#如果某一列的测试结果好的大于这一列的一半,则说明该芯片是好的
def fun(n, nums):
    judge = n // 2
    for i in range(n):
        summ = 0
        for j in range(n):
            summ += nums[j][i]
        if summ > judge:
                print(i+1, end=' ')   

n = int(input())
nums = []
for i in range(n):
    nums.append(list(map(int, input().split())))

fun(n, nums)

24 龟兔赛跑预测

#basic-24 龟兔赛跑预测
def fun(v1, v2, t, s, le):
    #兔子速度v1,乌龟速度v2,领先t米等s秒,总距离为l
    s1 = 0 #兔子的路程
    s2 = 0 #乌龟的路程
    time = 0 #计时
    stop = False #停止标志
    ts = 0 #计时停止时间
    while True:
        if s1 >= le or s2 >= le:
            if s1 >= le and s2 < le:
                print('R')
            elif s1 < le and s2 >= le:
                print('T')
            else:
                print('D')
            print(time)
            break
            
        time += 1
        s2 += v2
        if stop and ts != 0:
            ts -= 1
        else:
            stop = False
            s1 += v1
        if s1 - s2 >= t and not stop:
            ts = s
            stop = True

v1, v2, t, s, l = map(int, input().split())
fun(v1, v2, t, s, l)

25 回形取数

# basic-25 回形取数
def fun(nums, n, m):
    #确定循环的圈数,取行列最小的
    if n < m:
        c = n
    else:
        c = m
    if c & 1 == 0:
        c = c // 2
    else:
        c = c // 2 + 1
    for i in range(c):
        #外层圈数循环
        #左
        for j in range(i, n-i):
            #第一个数不打印空格,第二个数在前面打印空格,以满足最后不打印空格
            if i == 0 and j == 0:
                print(nums[j][i], end='')
            else:
                print(' ', nums[j][i], end='')
        #下
        for j in range(i+1, m-i):
            print(' ', nums[n-1-i][j], end='')
        #右
        for j in range(n-2-i, i-1, -1):
            #防止有奇数圈的最后一圈重复读,最后一圈仅为一行或一列
            if m % 2 != 0 and i == c-1: #在顺时针取数时,存在一些问题,可以判断打印的元素是否与矩阵的总元素是否相等来作为break条件,间leetcod 29
                break
            print(' ', nums[j][m-1-i], end='')
        #上
        for j in range(m-2-i, i, -1):
            #防止有奇数圈的最后一圈重复读,最后一圈仅为一行或一列
            if n % 2 != 0 and i == c-1:
                break
            print(' ', nums[i][j], end='')

nums = []
n, m = map(int, input().split())
for i in range(n):
    nums.append(list(map(int, input().split())))
fun(nums, n, m)

26 报时助手

#basic-26 报时助手
def fun(h, m):
    dic = {0:'zero', 1: 'one', 2:'two', 3:'three', 4:'four',
           5:'five', 6:'six', 7:'seven', 8:'eight', 9:'nine',
           10:'ten', 11:'eleven', 12:'twelve', 13:'thirteen',
           14:'fourteen', 15:'fifteen', 16:'sixteen', 17:'seventeen',
           18:'eighteen', 19:'nineteen', 20:'twenty'}
    dic1 = {2:'twenty', 3:'thirty', 4:'forty',5:'fifty'}
##    读小时
    if h <= 20:
        print(dic[h], end=' ')
    else:
        ge = h % 10
        print('twenty', dic[ge], end=' ')
##    读分钟
    if m == 0:
        print('o\'clock')
    elif m <= 20:
        print(dic[m], end=' ')
    else:
        ge = m % 10
        shi = m // 10
        print(dic1[shi], end=' ')
        if ge != 0:
              print(dic[ge])
        
h, m = map(int, input().split())
fun(h,m)

后面的不想做了,但还是贴上C++的代码

27 2n皇后问题

#include <string>
#include <iostream>
#include <cmath>

using namespace std;
/*int ans = 0, pos[21];

bool check(int col)
{//判断此列前面的
    for (int i = 1; i < col; i++)
    {
        if(pos[i] == pos[col] || abs(i - col) == abs(pos[i] - pos[col]))
            return false; // 如果有同行的,或则在对角的
    }
    return true;
}

void dfs(int col, int n)
{
    if (col == n + 1)
    {
        ans++;
    }
    for (int i = 1; i <= n; i++)
    {
        pos[col] = i;//将皇后放在col列,i行。
        if (check(col))//判断皇后放在这一列是否满足条件。
            dfs(col + 1, n);
    }

}

 题目:n个皇后,给出一个n*n的矩阵,输出n个皇后摆放的情况,不能在同行同列和对角线上。
 输入:n
 输出:情况
 注意:

int main()
{
	int n = 0;
	cin >> n;
	dfs(1, n);
	cout << ans << endl;

	return 0;
}
 */
 
 const int maxn = 10;  
int n;  
int map_Q[maxn][maxn];  
int posb[maxn]={0};  
int posw[maxn]={0};  
int ans;   
 
bool checkw( int cur) //检查函数
{  
    for( int i = 1; i < cur; i++)  
        if( posw[i] == posw[cur] || abs(i-cur) == abs(posw[i]-posw[cur]))  
            return false;  
    return true;  
}   
 
bool checkb( int cur)  //检查函数
{  
    for( int i = 1; i < cur; i++)  
        if( posb[i] == posb[cur] || abs(i-cur) == abs(posb[i]-posb[cur]))  
            return false;  
    return true;  
}  
 
void dfs_white( int cur)  
{  
    if( cur == n+1)  //白皇后也全部放完,次数+1
    {  
        ans++;  
      }
    for( int i = 1; i <= n; i++)  
    {  
        if( posb[cur] == i) //表示第cur列的第i行位置已经被黑皇后占用,
            continue;        //结束当前循环,i+1
        if( map_Q[cur][i] == 0)  //再判断前提条件是否成立
            continue;  
        posw[cur] = i;    //尝试把第cur列的白皇后放在第i行上
        if( checkw(cur))   //判断能否放置白皇后
            dfs_white(cur+1);  //递归
    }  
}  
  
void dfs_black( int cur)  
{  
    if( cur == n+1)  //当黑皇后处理完时,再处理白皇后
    {  
        dfs_white(1);  
    }  
    for( int i = 1; i <= n; i++)  
    {  
       if( map_Q[cur][i] == 0)  //如果第cur列第i行满足放皇后的前提条件即 mp[cur][i] == 1
            continue;  //如果不满足,则结束当前循环,进行下一次循环即i+1。
         posb[cur] = i;     //就尝试把第cur列的黑皇后放在第i行上
        if( checkb(cur))   //然后判断该尝试是否成立,如成立,则进行递归,如不成立,则尝试把当前列的黑皇后放在下一行(i+1行)上。
            dfs_black(cur+1);  //递归
    }  
}  
  
int main()  
{     
   cin>>n;
   for( int i = 1; i <= n; i++)   //定义棋盘
       for( int j = 1; j <= n; j++)  
           cin>>map_Q[i][j];    
   ans = 0;  
   dfs_black(1);    //先把黑皇后放在第一列
   cout<<ans<<endl; 
   
    return 0;  
}

28 Huffuman树

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int a[105];

 /*
 题目:Huffuman树, 找出最小的两个数,删除,然后将其和放入该数组中,费用为这两数和
 输入:n和n个数
 输出:一共的费用
 注意:无
 */
int main()
{
    int n, res = 0;
    cin >> n;

    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    for (int i = n - 1; i > 0; i--)
    {
        sort(a, a + i + 1);
        a[0] = a[0] + a[1];
        for (int k = 1; k < i; k++)
        {
            a[k] = a[k + 1];
        }
        res += a[0];
    }
    cout << res << endl;


    return 0;
}

29 高精度加法

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    int i,alen,blen;
	char a[101], b[101];
	int c[102] = {0};
	//memset(c,0,sizeof(c));//清零
    scanf("%s%s", a, b);
    alen = strlen(a);
    blen = strlen(b);
    for (i = 0; i < alen || i < blen; i++)
    {
        if (i < alen)
            c[i] += a[alen-i-1] - '0';
        if (i < blen)
            c[i] += b[blen-i-1] - '0';
        if (c[i] >= 10)
        {
            c[i+1] = c[i] / 10;
            c[i] %= 10;
        }
    }
    if (alen < blen) alen = blen;
    if (c[alen] > 0) printf("%d", c[alen]);
    for (i = alen - 1; i >= 0; i--)
        printf("%d", c[i]);
    return 0;
}

30 阶乘计算


#include <iostream>
using namespace std;
 /*
 题目:大数阶乘
 输入:n <= 1000
 输出:n!
 注意:https://blog.csdn.net/qq_40663810/article/details/86599567
 */
int main()
{
    int n, len = 0;
    int a[10000];
    int s,c=0;
    a[0] = 1;
    cin >>n;
    for (int i = 2; i <= n; i++)
    {
        for (int j = 0; j <= len; j++)
        {
            s = a[j]*i+c;
            a[j] = s % 10; //保留个位
            c = s / 10; //进位数。
            //cout << s << " " << a[j] << " " << c << endl;
            if (c != 0 && j == len)
                len++;
        }
    }
     for(int i=len;i>=0;i--)    //逆序输出
    {
		cout<<a[i];
    }
}

00 致谢

谢谢来自互联网上各各大佬的资源分享,具体参考的那些,大多都不清楚啦,有部分留在注释里面。
** C++ 版本的源代码下载地址**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值