当前位置: 首页 > 面试题库 >

Google Foobar挑战级别2“嘿,我已经做到了”

邓兴为
2023-03-14
问题内容

在解决Google Foobar挑战的第二阶段时,我需要帮助。

指挥官Lambda使用自动算法将小兵随机分配给任务,以使小兵保持脚尖。但是您已经注意到该算法的一个缺陷-
它最终会循环返回自身,因此,它不会像迭代那样分配新的奴才,而是陷入了一个值循环中,从而使相同的奴才最终可以完成并执行相同的任务。再次。您认为向Lambda指挥官证明这一点将为您的下一次晋升提供依据。

您已经确定该算法具有以下过程:

1)以随机小号ID n开头,它是基数b中长度为k的非负整数
。2)定义x和y为长度为k的整数。x具有n的降序数字,而y具有n的升序数字
3)定义z = x-y。在必要时向z添加前导零以保持长度k
4)分配n = z获得下一个奴才ID,然后返回到步骤2

例如,给定的minion ID n = 1211,k = 4,b = 10,然后x = 2111,y = 1112和z = 2111-1112
=0999。那么下一个minion ID将为n = 0999,并且算法再次迭代:x = 9990,y = 0999和z = 9990-0999 =
8991,依此类推。

取决于n,k(源自n)和b的值,算法在某个点到达一个周期,例如达到恒定值。例如,从n = 210022,k = 6,b =
3开始,该算法将达到值[210111、122221、102212]的周期,并且无论继续重复多少次,算法都将停留在该周期中。从n =
1211开始,例程将达到整数6174,并且由于7641-1467为6174,因此无论迭代多少次,该例程都将保持该值不变。

给定一个minion ID作为字符串n,代表在基数b中长度为k的非负整数,其中2 <= k <= 9和2 <= b <=
10,编写一个函数solution(n,b),该函数返回长度为以上算法的结束循环从n开始。例如,在上面的示例中,solution(210022,3)将返回3,因为在基数3中完成时在102212上进行迭代将返回210111。如果算法达到常数(例如0),则长度为1。

测试用例:
Solution.solution(“ 1211”,10)返回1
Solution.solution(“ 210022”,3)返回3

这是我的代码:

import java.util.ArrayList;
import java.util.Arrays;

public class Solution {

    public static int solution(String n, int b) {
        int k = n.length();
        String m = n;
        ArrayList<String> minionID = new ArrayList<>();

        while (!minionID.contains(m)) {
            minionID.add(m);
            char[] s = m.toCharArray();
            Arrays.sort(s);
            int y = Integer.parseInt(toString(s));
            int x = Integer.parseInt(reverseString(s));
            if (b == 10) {
                int intM = x - y;
                m = Integer.toString(intM);
            } else {
                int intM10 = ((int) Integer.parseInt(toBase10(x,b))) - ((int) Integer.parseInt(toBase10(y, b)));
                m = toBaseN(intM10, b);
            }

            m = addLeadingZeros(k, m);
        }
        System.out.println(minionID);
        return minionID.size() - minionID.indexOf(m);
    }

    private static String toBaseN (int intBase10, int b) {
        int residual = intBase10;
        ArrayList<String> digitsBaseN = new ArrayList<>();

        while (residual >= b) {
            int r = residual % b;
            digitsBaseN.add(Integer.toString(residual));
            residual = (residual - r) / b;
        }
        digitsBaseN.add(Integer.toString(residual));

        StringBuilder reverseDigits = new StringBuilder();
        for (int i = digitsBaseN.size() -1; i >= 0; i--) {
            reverseDigits.append(digitsBaseN.get(i));
        }
        return reverseDigits.toString();
    }

    private static String toBase10 (int intBaseN, int b) {
        int[] xArr = new int[Integer.toString(intBaseN).length()];
        int count = 0;
        for (int i = xArr.length - 1; i >= 0; i--) {
            xArr[count] = Integer.toString(intBaseN).charAt(i) - '0';
            count++;
        }

        int yBase10 = 0;

        for(int i = 0; i < xArr.length; i++) {
            yBase10 += xArr[i] * (Math.pow(b, i));
        }
        return Integer.toString(yBase10);
    }

    public static String toString(char[] arr) {
        StringBuilder newString = new StringBuilder();
        for (char c : arr) {
            newString.append(c);
        }
        if (newString.toString().contains("-")) {
            newString.deleteCharAt(0);
        }
        return newString.toString();
    }

    public static String reverseString(char[] arr) {
        StringBuilder newString = new StringBuilder();
        for (int i = arr.length - 1; i >= 0; i--) {
            newString.append(arr[i]);
        }
        if (newString.toString().contains("-")) {
            newString.deleteCharAt(newString.length()-1);
        }
        return newString.toString();
    }

    public static String addLeadingZeros(int k, String z) {
        if (k > z.length()) {
            String zeros = "";
            for (int i = 0; i < (k - z.length()); i++) {
                zeros += "0";
            }
            zeros += z;
            return zeros;
        }
        return z;
    }

仅适用于十个测试用例中的三个


问题答案:

def answer(n, b):

    k = len(n)
    m = n
    mini_id = []
    while m not in mini_id:
        mini_id.append(m)
        s = sorted(m)
        x_descend = ''.join(s[::-1])
        y_ascend = ''.join(s)        
        if b == 10:
            int_m = int(x_descend) - int(y_ascend)
            m = str(int_m)
        else:
            int_m_10 = int(to_base_10(x_descend, b)) - int(to_base_10(y_ascend, b))
            m = to_base_n(str(int_m_10), b)

        m =  (k - len(m)) * '0' + m
    return len(mini_id) - mini_id.index(m)


 类似资料:
  • 本文向大家介绍w3c编程挑战_初级脚本算法实战篇,包括了w3c编程挑战_初级脚本算法实战篇的使用技巧和注意事项,需要的朋友参考一下 之前偶然看到了w3c上的编程挑战题,就像拿来试试手,先做的是初级脚本算法,总体不难,如果有更好的方法,希望能一起交流! 1、翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。 2、计算一个整数的阶乘 如果用字母n来代

  • 问题内容: 据说SpringLayout非常强大。我试图使用SpringLayout实现我认为是相当简单的布局,但是我失败了。 减少到最低限度,我希望在JFrame上并排放置4个JButton: 我希望所有4个文本的大小相同,无论文本如何不同。 我希望最外面的一个(b1和b4)与容器的边界之间保持恒定的水平距离,即5 px,并且与按钮的南北之间的边界都保持5 px,它们的高度均相同。 我希望按钮之

  • 综合挑战 本章节收集各种各样坑人无数的 JavaScript 题目,保证虐得大家不要不要的,祝大家好运。 如果你还遇到过其他特别坑的 JavaScript 题目欢迎 PR 给我,让我们一起虐爆其他人。 // 挑战一 function Foo() { getName = function () { alert (1); }; return this; } Foo.getName =

  • chatGPT是否取代人工的神器,1.挑战我们的工作岗位,2.挑战我们的教育,3.挑战我们人类的尊严,4.AIGC领域如何监管?,5.数据隐私和安全,6.技术依赖性

  • 这个程序的目的是得到一个像“1256”这样的长变量,然后逐个数字相加,直到剩下一个个位整数。所以,,返回。 当我尝试验证时,它会给出错误: com.google.challenges.中找不到参数(int)的公共静态方法答案 有人能帮我理解这个错误的含义以及如何修复它吗?

  • 简介 挑战者 STM32F429 是野火推出的一款基于 ARM Cortex-M4 内核的开发板,最高主频为 180Mhz,该开发板具有丰富的板载资源,可以充分发挥 STM32F429 的芯片性能。 开发板外观如下图所示: 该开发板常用 板载资源 如下: MCU:STM32F429IGT6,主频 180MHz,1024KB FLASH ,256KB RAM 外部 RAM:IS42S16400J(S

  • CodingBat中的给定任务sameEnds: 给定一个字符串,返回出现在字符串开头和结尾且不重叠的最长子字符串。例如,sameEnds(“abXab”)是“ab”。 我的解决方案通过了所有测试,除了一个^: 这里有什么问题?我怎样才能修复它?

  • 给定CodingBat中的任务maxBlock: 给定一个字符串,返回字符串中最大“块”的长度。块是相同的相邻字符的运行。 我的解决方案通过了所有测试,除了一个: