Java | Python | C++ 机试/手撕技巧

前言

机试如果掌握一定的技巧能够大大减小代码量

或者是面试C++,机试用Python有时候也能节约时间

(数据量一般但处理逻辑麻烦)

避免重复造轮子

如有错误,评论补充

建议点赞收藏转发

不定时更新

栈、队列、哈希表的实现(基础,防止忘记)

Python

栈:

stack = [] # 创建一个空栈
stack.append(1) # 入栈
stack.pop() # 出栈

队列

from collections import deque
queue = deque() # 创建一个空队列
queue.append(1) # 入队
queue.popleft() # 出队

哈希表

hash_map = {} # 创建一个空哈希表
hash_map['key1'] = 'value1' # 添加键值对
hash_map['key1'] # 查询键值对,'value1'
hash_map.pop('key1') # 删除键值对,'value1'

Java:

Stack<Integer> stack = new Stack<Integer>(); // 创建一个空栈
stack.push(1); // 入栈
stack.pop(); // 出栈,

队列

Queue<Integer> queue = new LinkedList<Integer>(); // 创建一个空队列
queue.offer(1); // 入队
queue.poll(); // 出队,1

哈希表

Map<String, String> hash_map = new HashMap<String, String>(); // 创建一个空哈希表
hash_map.put("key1", "value1"); // 添加键值对
hash_map.get("key1"); // 查询键值对,"value1"
hash_map.remove("key1"); // 删除键值对,"value1"

C++:

栈:

stack<int> s; // 创建一个空栈
s.push(1); // 入栈
s.pop(); // 出栈

队列:

queue<int> q; // 创建一个空队列
q.push(1); // 入队
q.pop(); // 出队

哈希表:

unordered_map<string, string> hash_map; // 创建一个空哈希表
hash_map["key1"] = "value1"; // 添加键值对
hash_map["key1"]; // 查询键值对,"value1"
hash_map.erase("key1"); // 删除键值对,返回1

四舍五入输出

Python

#round(1.45, 1) 输出1.4,  底层是“四舍六入五成双”” 
round(1.45+1e-3, 1) #输出1.5正确

Java

System.out.printf("%.1f", 1.45);  //输出1.5 无误

C++

//cout << setprecision(2) << 1.45;  (#include <iomanip> 输出1.4错误、
//round() 不支持保留小数
//printf("%3.1f",1.45); 输出1.4错误
//printf("%.1f",1.45);  完全错误,格式不能省略整体的长度(即3位)
printf_s("%.1f",1.45); // 输出1.5 正确 

将数组中符合条件的数修改

如把>n的数改为k

python

my_list = [1, 2, 3, 4, 5, 6]
n = 3
k = 10
new_list = [k if x > n else x for x in my_list] #都没有原地修改
#new_list = list(map(lambda x: k if x > n else x, vec))
print(new_list)  # [1, 2, 3, 10, 10, 10]

java

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> my_list = new ArrayList<>();
        my_list.add(1);
        my_list.add(2);
        my_list.add(3);
        my_list.add(4);
        my_list.add(5);
        my_list.add(6);
        int n = 3;
        int k = 10;

        List<Integer> new_list = my_list.stream()
                .map(x -> x > n ? k : x)
                .collect(Collectors.toList());

        System.out.println(new_list);  // [1, 2, 3, 10, 10, 10]
    }
}

C++

for(auto& num : vec){ //&引用原地修改
  if(num > n) num = k;

待补充……

附录

  • python实现动归或者剪枝难以100%的情况下,可以使用Java替代(一般Java和Python的时空限制为同一档,C/C++自成一档)
  • 不算太稀疏的int/char型的map使用数组替换(一般可以new int[1000000])
  • 递归调用的时候使用尾递归,并且先判断再进入避免heap爆炸
  • C++的报错信息可能会没有Python和Java的信息明显(具体哪行错误)
  • 考试结束前5分钟一定要全部提交一遍,避免同时考试的人太多卡死
  • 无需像牛客这种考虑多个用例输入(除非有明显报错)
  • 输出题目中的用例(基本没用)
  • 一般树、链表等非库内数据结构的题,不会是ACM模式
  • 贪心、DFS、动态规划为重要考点,但一般都可以用DFS先暴力拿点分再优化剪枝(需熟悉递归写法,visited数组)
  • 最好不要把机试题原封不动的分享出来,因为做题前都会有大前提……
  • 手撕代码一般不允许本地ide调试,在线运行的话多用print
  • 如果输出为单个数字,可以试着print某些和题目有关联的数字,比如0,输入的大小
  • ……

#笔试##机试#
全部评论
锴神!
1 回复 分享
发布于 2023-04-19 00:01 海南
大佬,请问面试手撕的时候能不能用Python,面试官一般会指定语言吗😂
1 回复 分享
发布于 03-03 00:22 北京

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
14 95 评论
分享
牛客网
牛客企业服务