【算法题】机试指南篇

每日更新,建议关注收藏!

本站友情链接:

  1. c/c++算法题指南
    严书代码
    c/c++大复习1
    c/c++大复习2
  2. python算法题指南
    牛客华为机试103精华

须知

本文所选题目均含有原题地址,可直接获取c/c++以及python版解析。

评判结果

评判结果就是提交代码后系统返回的结果,这个不仅仅只是一个结果,还可以是一个debug的提示。

what the oj returns tip
Accepted yes!
Wrong Answer 解决方案:1.考虑特殊数据、边界数据、溢出 2.算法本身正确性
Presentation Error 格式错,建议重新打印输出看下是否符合格式
Time Limit Exceeded 死循环,边界数据,复杂度过高需要优化
Runtime Error 访问内存地址越界如下标越界,除0,调用禁止使用的函数,递归过深等的栈溢出
Compile Error 程序本身语法错误且无法进行编译
Memory Limit Exceeded 空间复杂度过高,死循环或申请空间过量
Output Limit Exceeded 死循环、关闭调试信息

考试规则提前了解

是全答对才有分数,还是答对多少测试点就能达到对应比例的分数,这点在备考期间很重要。

语言与IDE选择

最常见的是c/c++对应codeblocks
python推荐vscode

现成模版以及提示

  1. reverse数字反转
int reverse(int x){
	int revx=0;
	while(x!=0){
		revx*=10;
		revx+=x%10;
		x/=10;
	}
	return revx;
}
  1. while(scanf(“%d”,&h)!=EOF)的含义
    EOF通常被定义为-1,表示文件结束符。它用于指示已到达文件的末尾或输入流的末尾。
    scanf函数是有返回值的,返回的是被输入函数成功赋值的变量个数。当输入结尾时scanf函数返回EOF,则跳出循环,不再继续算法处理。

精选分类

可暴力求解的题目

枚举

枚举简单的都省略,注意对枚举量的优化即可(防止超时间)。

题目:old bill
点击题目转到判题平台

from re import I
import sys
i=0
n=0
sum=0
def count(n,x,y,z):
    first=9
    last=9
    while first:
        if last==0:
            last=9
            first-=1
        else:
            last-=1
        sum=int(first)*10000+int(x)*1000+int(y)*100+int(z)*10+last
        if int(sum/n)*int(n)==int(sum):
            print(first,last,int(sum/n)) #,分割就已经自带空格了
            return 2
    return -1 #注意这里的没有可能的情况 要特别输出0
        

for line in sys.stdin:
    a = line.split()
    i+=1
    if (i%2):
        n=a[0]
    else:
        if(count(int(n),int(a[0]),int(a[1]),int(a[2]))==-1):
            print(0)
    #print(a,i)

图形排版

这种题目核心:找数学规律,注意输出的格式。

叠筐 杭电oj

题目描述:
把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。

输入:
输入一个三元组,分别是外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后两者都为ASCII可见字符。

输出:
输出叠在一起的筐图案,中心花色和外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉,叠筐与叠筐之间应有一层间隔。
在这里插入图片描述
首先这个图怎么看的,它总体是一个层层圈包的形态,最后去掉最外层4个角
本题思路在于构造两次二重循环,第一次二重循环在于每次按行放正确元素,第二次二重循环在于每次按列放正确元素,渲染步骤如下:
在这里插入图片描述
也就是说 第一次循环已经把两个三角形的矩阵元素放好了,第二次循环放好阴影区域的两个三角形中的元素。

def print_box(n_,a,b):
    array_ = [[' ' for k in range(n_)] for i in range(n_)]
    book = [[0 for k in range(n_)] for i in range(n_)]
    num=0
    true_a=a
    true_b=b
    for i in range(n_):
        for j in range(num,n_-num):
            if(book[i][j]==0):
                array_[i][j]=b
                book[i][j] == 1
            if (book[n_-num-1][j] == 0):
                array_[n_-num-1][j] = b
                book[n_-num-1][j] == 1
        num+=1
        a, b = b, a
    #print(array_)

    a,b=true_a,true_b
    num=0
    for i in range(n_):
        for j in range(num,n_-num):
            if(book[j][i]==0):
                array_[j][i]=b
                book[j][i] == 1
            if (book[j][n_-num-1] == 0):
                array_[j][n_-num-1] = b
                book[j][n_-num-1] == 1
        num+=1
        a, b = b, a
    #print(array_)
    array_[0][0]=' '
    array_[0][n_-1] = ' '
    array_[n_ - 1][0] = ' '
    array_[n_-1][n_ - 1] = ' '
    
    for m in range(n_):
        for n in range(n_):
            print(array_[m][n],end='')
        print('\n')

if __name__ == '__main__':
    line = input()
    line=line.split()
    n=line[0]
    a=line[1]#center
    b=line[2]#outer

    print_box(int(n),a,b)

repeater北大复试
刚开始没看懂这题规律,后来发现:
用一个二维数组来存储基本图形,之后遍历图形,level从0开始,遇到字符就用基本图形去填充结果,遇到空格就用len*len个空格(len与=n的level次方)去填充,循环一次更新结果,使结果作为新的模板,直到level达到输入的要求。

输入:
3
# #
 # 
# #
1
3
# #
 # 
# #
3
4
 OO 
O  O
O  O
 OO 
2
0
输出:
# #
 # 
# #
# #   # #         # #   # #
 #     #           #     # 
# #   # #         # #   # #
   # #               # #   
    #                 #    
   # #               # #   
# #   # #         # #   # #
 #     #           #     # 
# #   # #         # #   # #
         # #   # #         
          #     #          
         # #   # #         
            # #            
             #             
            # #            
         # #   # #         
          #     #          
         # #   # #         
# #   # #         # #   # #
 #     #           #     # 
# #   # #         # #   # #
   # #               # #   
    #                 #    
   # #               # #   
# #   # #         # #   # #
 #     #           #     # 
# #   # #         # #   # #
     OO  OO     
    O  OO  O    
    O  OO  O    
     OO  OO     
 OO          OO 
O  O        O  O
O  O        O  O
 OO          OO 
 OO          OO 
O  O        O  O
O  O        O  O
 OO          OO 
     OO  OO     
    O  OO  O    
    O  OO  O    
     OO  OO     

try:
    while True:
        num = int(input())
        if num == 0:
            break
        result = []  # 输出结果
        template = []  # 起初模板(不变)
        for i in range(num):
            template.append(input())
            result.append(template[i])
        sign = result[0].split()[0][0]  # 得到符号
        zoomsNum = int(input())
        for i in range(1, zoomsNum):  # i为放大的倍数
            replaceNum = num ** i#画布大小
            example = []  # 保存着前一个倍数的模板
            blanks = " " * replaceNum  # 当前倍数比较起初模板空格被放大的倍数
            for j in range(num):  # j为起初模板对于的行
                for k in range(replaceNum):  # k是对应起初模板的一行中被放大倍数后的行数
                    if j == 0:
                        example.append(result[k])  # 保存着前一个倍数的模板
                        result[k] = template[j].replace(
                            " ", blanks
                        )  # 在起初第一行模板不需要增加行数,所以只需要放大空格和符号sign就好
                    else:
                        result.append(template[j].replace(" ", blanks))
                    signLines = example[k]  # 把每一个符号位替换成上一个倍数对应的行
                    result[k + j * replaceNum] = result[k + j * replaceNum].replace(
                        sign, signLines
                    )
        for i in result:
            print(i)
except Exception:
    pass

日期问题

其他模拟

基础:排序查找

基础:字符串

STL

STL定义了强大的、基于模板的、可复用的组件,实现了许多通用的数据结构及处理这些数据结构的算法。其中包含三个关键组件——容器(container,流行的模板数据结构)、迭代器(iterator)和算法(algorithm)。

容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
迭代器 用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。
算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。

向量vector

队列queue

栈stack

贪心

简单贪心

区间贪心

递归与分治

搜索

深搜

广搜

数据结构进阶

二叉树

二叉排序树

优先队列

散列表

动态规划

递归求解

最大连续子序列和

最长递增子序列

最长公共子序列

背包问题

其他问题

图论

并查集

最小生成树

最短路径

拓扑排序

关键路径

数学问题

进制转换

最大公约数&最小公倍数

质数

质因数

快速幂

矩阵、矩阵快速幂

高精度整数

相关推荐

  1. 王道指南 复试准备day1

    2024-05-10 14:24:09       43 阅读
  2. 华为荣耀终端

    2024-05-10 14:24:09       39 阅读
  3. 华为 C++ 实现【字符串重新排列】

    2024-05-10 14:24:09       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-10 14:24:09       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-10 14:24:09       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-10 14:24:09       82 阅读
  4. Python语言-面向对象

    2024-05-10 14:24:09       91 阅读

热门阅读

  1. 模仿memmove函数

    2024-05-10 14:24:09       28 阅读
  2. QT设计模式:模板模式

    2024-05-10 14:24:09       33 阅读
  3. 代码随想录算法训练营第四十七天

    2024-05-10 14:24:09       31 阅读
  4. linux自用命令

    2024-05-10 14:24:09       24 阅读
  5. golang系统内置函数整理

    2024-05-10 14:24:09       32 阅读
  6. 学习Python第6天:函数与模块

    2024-05-10 14:24:09       27 阅读