豆包MarsCode AI刷题

70 阅读3分钟

寻找最大葫芦数 这个题目因为没有看清题目要求写了很久,1才是牌面最大的!!!

public class Main { public static int[] solution(int n, int max, int[] array) {// 统计每种牌面值的数量 int[] count = new int[14]; // 1到13的牌面值,索引0不用 for (int card : array) { count[card]++; }

    // 从最大的牌面值开始寻找“葫芦”组合
    for (int i = 13; i >= 1; i--) {
        if (count[i] >= 3) {
            // 找到三张相同牌面值的牌
            count[i] -= 3;
            for (int j = 13; j >= 1; j--) {
                if (count[j] >= 2) {
                    // 找到两张相同牌面值的牌
                    if (i * 3 + j * 2 <= max) {
                        return new int[]{i, j};
                    }
                }
            }
            // 如果当前三张牌无法组成“葫芦”,恢复计数
            count[i] += 3;
        }
    }

    // 如果没有找到符合条件的“葫芦”组合,返回 {0, 0}
    return new int[]{0, 0};
}这是最开始的代码

int[] count = new int[14]; // 1到13的牌面值,索引0不用 for (int card : array) { count[card]++; } 通过使用最强for循环遍历每个元素计算出牌面的个数; 然后从最大牌面开始寻找,就是从这里出的问题,不应该从13开始找,应该从1 然后13找,这样就不会出错

public class Main { public static int[] solution(int n, int max, int[] array) { // 统计每种牌面值的数量 int[] count = new int[14]; // 1到13的牌面值,索引0不用 for (int card : array) { count[card]++; } //就是这里重新定义了顺序 // 定义牌面大小顺序 int[] order = { 1, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };

    // 按照指定顺序寻找“葫芦”组合
    for (int i : order) {
        if (count[i] >= 3) {
            // 找到三张相同牌面值的牌
            count[i] -= 3;
            for (int j : order) {
                if (count[j] >= 2) {
                    // 找到两张相同牌面值的牌
                    if (i * 3 + j * 2 <= max) {
                        return new int[] { i, j };
                    }
                }
            }
            // 如果当前三张牌无法组成“葫芦”,恢复计数
            count[i] += 3;
        }
    }

    // 如果没有找到符合条件的“葫芦”组合,返回 {0, 0}
    return new int[] { 0, 0 };
}

修改后的代码,主要是修改了定义牌面大小的顺序,然后再按照定义的顺序去寻找组合

二进制之和 题目:返回两个二进制字符串的十进制求和结果。 例如"101"和"110"返回11 先创建一个StringBuilder()它可以用 .append()方法将字符串加在一起,不需要再重新创建一个类了 然后定义一个carry用来存储进位,int i = binary1.length() - 1; int j = binary2.length() - 1;再通过while循环: sum是用来存储当前位的和,我们取出第一个字符串的最后一个元素的值,将它转换为数字以后,i--;这里减去字符串零是为了将字符串的数字转换为数字,存到sum当中,j的值也这样操作。然后处理计算的值,将sum的值%2,这样可以得到二进制相加以后的值,进位就用carry来处理,sum/2得到carry,如果sum=2就进位,sum=1就不进位,最后处理进位,如果最后的carry等于1的话就是要进位了,将carry的值直接添加到result中就好了。 return new BigInteger(result.reverse().toString(), 2).toString();这里就是将得到的result变成十进制, result.reverse()这是将result字符串进行反转,因为我们存储的时候是反着存储的,result.reverse().toString(), 2这里是将他变成字符串,因为result是StringBuilder对象,然后将他变成十进制,后面的2是未转换之前的进制,最后将他整体的变成字符串。