📜  TCS CodeVita 采访 |数字与忍者简介(1)

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

TCS CodeVita 采访 | 数字与忍者简介

活动简介

TCS CodeVita 是由印度最大的信息技术服务公司Tata Consultancy Services(TCS)所举办的全球性编程挑战赛。自2012年开始,每年都有数以万计的学生和专业人士参加,是全球最具影响力和最具权威性的编程比赛之一。

数字与忍者题目简介

TCS CodeVita 采用的是十分严谨和考验参赛者思维和编程能力的智力题目,其中最著名的就是“数字与忍者”这道题目。这道题目的描述是这样的:

小K是一名忍者,他只使用数字0-9和2个运算符+和*。其中,小K定了3种指令:将当前的数字+1,将当前的数字*2,以及将前面的一个数字与当前的数字代表的值相加。假如小K初始值是1,那么通过若干条指令,能否构造出数字为888的表达式呢?

这道题目看起来十分简单,但要想在规定的时间内解答出来却是一项极具挑战的任务。参赛者需要通过各种数据结构、算法和逻辑思维的运用,才能找到最优的解法。

解题思路
  • 首先,可以使用广度优先算法去生成所有的数字表达式,可以用一个队列来实现,队列中的元素包括当前数字、表达式还有上一步是哪一种操作;
queue = []
queue.append([1, '1', 0])
while queue:
    num, exp, op = queue.pop(0)
    if num == 888:
        print(exp)
        break
    if num + 1 <= 888:
        queue.append([num + 1, exp + '+1', 1])
    if num * 2 <= 888:
        queue.append([num * 2, exp + '*2', 2])
    if op == 1 and num + last_num <= 888:
        queue.append([num + last_num, exp + '+' + str(last_num), 3])
  • 但是这种做法会超时,可以使用剪枝来优化,比如减少队列中的元素,只放入比目标数字小的数字:
queue = []
queue.append([1, '1', 0])
while queue:
    num, exp, op = queue.pop(0)
    if num == 888:
        print(exp)
        break
    if num < 888:
        if num + 1 <= 888: 
            queue.append([num + 1, exp + '+1', 1])
        if num * 2 <= 888:
            queue.append([num * 2, exp + '*2', 2])
        if op == 1 and num + last_num <= 888:
            queue.append([num + last_num, exp+'+'+str(last_num), 3])

此外还可以做一些优化,比如记录下当前num的值,优化操作3的选取。

总结

TCS CodeVita 不仅是一次全球性的编程挑战赛,更是一项能够锻炼参赛者思维和编程技能的极佳机会。数字与忍者这道题目,看似简单,实则不易,需要考验编程者的求数组、广度优先遍历、算法思维、剪枝优化等方面的知识与技能。