面试中常见的有意思的题目

这两天在面试找新工作,遇到了两个面试题,虽然简单,但是感觉很有意思,记录一下。

一个会计题

  • 一双鞋进价 25 元,卖价 32 元,顾客买一双鞋给了老板 100 元,老板没有零钱就去邻居那里拿这 100 元换了零钱、然后找了顾客 68 元,顾客走后,邻居发现这 100 元为假钱老板没有办法又给了邻居100元,请问老板总共损失了多少钱?
1
2
3
4
5
6
这题算是一道会计题,只需要区分出出入即可:
1. 邻居:出入都是100,合计为0;
3. 顾客:出100元假钞,计算为0,入价值25的鞋,入68元,共计93;
2. 老板:老板对邻居出入合计为0;顾客入即老板出,93;

所以这题很简单:25+68=93

一个简单的取重复数值算法

  • 有两个数组,都是按大小正向排列且数组内无重复元素,例如a=[0,2,8,11,32];b=[2,11,55,87],请使用任意一种语言找到两个数组之间相等的元素,要求不要调用任何系统函数,不要使用循环嵌套即算法复杂度为 O(n);
  1. hash方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    def find_common_elements(a, b):
    # 使用哈希表存储第一个数组的元素
    hash_table = {}
    for element in a:
    hash_table[element] = True

    # 遍历第二个数组,找到相等的元素
    common_elements = []
    for element in b:
    if element in hash_table:
    common_elements.append(element)

    return common_elements

    # 示例数组
    a = [0, 2, 8, 11, 32]
    b = [211, 55, 8, 87]

    # 调用函数
    result = find_common_elements(a, b)
    print("两个数组之间相等的元素:", result)
  2. 双游标方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    def find_common_elements_two_pointers(a, b):
    # 初始化两个指针
    pointer_a = 0
    pointer_b = 0
    common_elements = []

    # 遍历两个数组,直到任意一个指针到达数组末尾
    while pointer_a < len(a) and pointer_b < len(b):
    if a[pointer_a] == b[pointer_b]:
    # 如果两个指针指向的元素相等,加入结果列表并移动两个指针
    common_elements.append(a[pointer_a])
    pointer_a += 1
    pointer_b += 1
    elif a[pointer_a] < b[pointer_b]:
    # 如果 a 的当前元素小于 b 的当前元素,移动 a 的指针
    pointer_a += 1
    else:
    # 如果 b 的当前元素小于 a 的当前元素,移动 b 的指针
    pointer_b += 1

    return common_elements

    # 示例数组
    a = [0, 2, 8, 11, 32, 87, 211, 1234]
    b = [8, 32, 87, 211, 235, 987, 1234]

    # 调用函数
    result = find_common_elements_two_pointers(a, b)
    print("两个数组之间相等的元素:", result)

两道题目本身就是很简单的题目,但是他真的可以避免混水摸鱼的那些家伙,也就是口头很秀实际能力不怎么样的那伙人,这两个题目跟我之前看到的另一个题目很相似。

Fizz Buzz

  • 如果一个数字能被 3 整除,输出 “Fizz”。
  • 如果一个数字能被 5 整除,输出 “Buzz”。
  • 如果同时能被 3 和 5 整除,输出 “FizzBuzz”。
  • 如果以上条件都不满足,则输出数字本身。
1
2
3
4
5
6
7
8
9
10
11
for (int num = 1; num <= 20; num++) { // 你可以调整范围
if (num % 3 == 0 && num % 5 == 0) {
printf("zoopseep\n");
} else if (num % 3 == 0) {
printf("zoop\n");
} else if (num % 5 == 0) {
printf("seep\n");
} else {
printf("%d\n", num);
}
}

这道题能够考察多个编程和逻辑相关的知识点。

  1. 能否清晰地理解题目要求,并将其转换为程序逻辑。
  2. 对基础语句的熟练使用。
  3. 对数组边界的处理。
  4. 考察题目完成的时间。

总之我觉得在面试的时候,有这种笔试很有意思,没有很高的难度,但在工作中完全够用。