📜  TCS 面试经历 | Codevita-9 2020(1)

📅  最后修改于: 2023-12-03 15:20:32.859000             🧑  作者: Mango

TCS面试经历 | Codevita-9 2020

简介

Codevita是TCS的全球编程大赛,由来自世界各地的程序员参加。这个比赛它是一个非常严格的面试和测试过程,它涉及到算法,数据结构和程序设计的多个方面,不仅需要程序员解决算法问题,还需要他们在规定时间内完成代码。 下面是我在Codevita-9 2020比赛中的经历。

面试过程

在面试开始前,我需要先进行一次笔试。笔试内容涵盖了编程知识、算法、数据结构等多个方面。

笔试结束后,我被邀请参加Codevita-9的在线编程比赛。比赛时间为3小时,涵盖了3个不同的问题。我必须在规定时间内解决这些问题。

第一个问题

第一个问题是一个比较简单的问题,涉及到排列组合问题。给定一个字符串S和一个数字K,找出S中包含K个字符的所有组合。

例如: 如果S是”abc”且k是2,那么原字符串S的所有长度为k的组合是[“ab”,”ac”,”bc”]。

代码片段如下:

def combinations(str, k):
    result = []
    if len(str) < k:
        return result

    if k == 1:
        for s in str:
            result.append(s)
        return result

    for i in range(len(str)):
        c = str[i]
        rest_combination = combinations(str[i+1:], k - 1)
        for rc in rest_combination:
            result.append(c + rc)

    return result


S = "abc"
k = 2

result = combinations(S, k)
print(result)
第二个问题

第二个问题是一个比较复杂的算法问题,它涉及到寻找多个矩形的联合区域。给出一些2D矩形的左上角和右下角坐标,你的任务是找出它们的联合区域。 联合区域是指:所有矩形重叠部分的形成的最小包含矩形。

例如:

输入:[[0,0,2,2],[1,1,3,3]]

输出: [1,1,2,2]

具体实现过程可以参考以下Python代码:

def find_common_area(rectangles):
    if not rectangles:
        return []

    # 找到所有矩形的左上角和右下角坐标
    left_ups = [(x1, y1) for x1, y1, x2, y2 in rectangles]
    right_downs = [(x2, y2) for x1, y1, x2, y2 in rectangles]

    # 找到矩形的最大和最小x、y坐标
    max_x = max(x for x, y in right_downs)
    min_x = min(x for x, y in left_ups)
    max_y = max(y for x, y in right_downs)
    min_y = min(y for x, y in left_ups)

    # 检查每个矩形是否完全包含在最小矩形中
    for x1, y1, x2, y2 in rectangles:
        if x1 >= max_x or x2 <= min_x or y1 >= max_y or y2 <= min_y:
            return []

    return [min_x, min_y, max_x, max_y]


rectangles = [[0,0,2,2],[1,1,3,3]]

result = find_common_area(rectangles)
print(result)
第三个问题

第三个问题是一个较难的问题,它涉及到机器智能和搜索算法。问题是给出一些代表棋盘状态的字符串,找出所有在下一步中可能的棋盘状态。每个棋盘状态都是一个字符串,其中字符“x”代表一个棋子的位置。在下一步中,棋子可以沿任何方向移动,直到遇到棋盘的边界或另一颗棋子。

例如: 如果当前的棋盘状态是:

xxoo
ooxo
oxox
xoxo

那么下一步可能的棋盘状态是:

oxoo
xxoo
ooxo
xoxo

oxox
xxoo
ooxo
xoxo

下面是这个问题的Python代码实现:

def get_next_states(board_state):
    board = []
    for row in board_state.split("\n"):
        board.append(list(row))

    next_states = []

    for i in range(len(board)):
        for j in range(len(board[0])):
            if board[i][j] == "x":
                # 向右移动
                if j+1 < len(board[0]) and board[i][j+1] == "o":
                    next_board = [list(row) for row in board]
                    next_board[i][j] = "o"
                    next_board[i][j+1] = "x"
                    next_states.append("\n".join(["".join(row) for row in next_board]))
                # 向左移动
                if j-1 >= 0 and board[i][j-1] == "o":
                    next_board = [list(row) for row in board]
                    next_board[i][j] = "o"
                    next_board[i][j-1]= "x"
                    next_states.append("\n".join(["".join(row) for row in next_board]))
                # 向上移动
                if i-1 >= 0 and board[i-1][j] == "o":
                    next_board = [list(row) for row in board]
                    next_board[i][j] = "o"
                    next_board[i-1][j]= "x"
                    next_states.append("\n".join(["".join(row) for row in next_board]))
                # 向下移动
                if i+1 < len(board) and board[i+1][j] == "o":
                    next_board = [list(row) for row in board]
                    next_board[i][j] = "o"
                    next_board[i+1][j]= "x"
                    next_states.append("\n".join(["".join(row) for row in next_board]))

    return next_states


board_state = "xxoo\nooxo\noxox\nxoxo"

next_states = get_next_states(board_state)

for state in next_states:
    print(state)
总结

Codevita-9 2020比赛是我第一次参加TCS的全球比赛。这次比赛让我确信,作为程序员,不能只是掌握一些编程基础知识和技术,还需要有很强的算法和数据结构能力,并且要善于利用搜索和优化等技术。在以后的工作中,我会继续努力学习,提高自己的编程能力和解决问题的能力。