寻找最大葫芦数 这个题目因为没有看清题目要求写了很久,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是未转换之前的进制,最后将他整体的变成字符串。