一、题目
按奇偶性交换后的最大数字
二、代码
做出来咯🎉🎉🎉
class Solution {
public int largestInteger(int num) {
// 整体:分成奇偶,在每个位置挑选合适的数字
// 设置两个数组分别存放奇偶
// 由于位数不确定,从后往前开始遍历判断奇偶 每次和当前最小的交换
// 最后结果是倒过来的,需要进行以此reverse得到最终结果
int n = num;
List<Integer> odd = new ArrayList<Integer>();
List<Integer> even = new ArrayList<Integer>();
int countOdd = 0;
int countEven = 0;
while(n%10!=0 || n!=0) {
int t = n%10;
if(t%2==1) {
odd.add(t);
} else {
even.add(t);
}
n = n/10;
}
Collections.sort(odd); // 升序
Collections.sort(even);
// Collections.sort(odd, Collections.reverseOrder()); // 降序
// Collections.sort(even, Collections.reverseOrder());
int res = 0;
StringBuffer sb = new StringBuffer();
while(num%10!=0 || num!=0) {
int temp = num%10;
if(temp%2==1) {
sb.append(String.valueOf(odd.get(countOdd)));
countOdd++;
} else {
sb.append(String.valueOf(even.get(countEven)));
countEven++;
}
num = num/10;
}
sb.reverse();
res = Integer.valueOf(sb.toString());
return res;
}
}
三、题解
/**
力扣无java题解,但思路与算法与上述代码类似,供参考:
思路与算法
根据题意,为了使得交换后的数字最大,我们需要让 num 所有数值为奇数和偶数的十进制位对应的数值都各自按照数值大小降序排序。
为了实现这一操作,我们首先需要将 num 转化为字符串或者每十进制位数值组成的数组,随后再在生成的字符串或数组上进行排序操作。
对于具体的排序操作,考虑到实现的难度,我们可以使用较为简单的原地排序算法,例如冒泡排序或选择排序。需要注意,只有当两个下标对应的数值的奇偶性相同时,才进行大小比较与可能的交换操作。
// 判断两个数值奇偶性是否相同:(s[i] - s[j]) % 2 == 0
最终,我们将排序后的数组转化为整数并返回。
*/
作者:力扣官方题解
来源:力扣(LeetCode)
四、总结
其他:
① 获取(遍历)ArrayList中元素的两种方法
(1)for(int i:list) { // 对元素i进行操作 }
(2)list.get(n) // n为0,1,2,3…自然数
② Java对ArrayList进行排序
使用 Java 中 Collections 类的 sort() 方法对 ArrayList 进行排序
sort() 方法以要排序的集合和 Collections.reverseOrder() 作为参数,返回一个按降序排列的集合
Collections.reverseOrder() 在此方法中充当比较器
// 升序:Collections.sort(ArrayList);
// 降序:Collections.sort(ArrayList, Collections.reverseOrder());
③ StringBuffer类
(1)创建StringBuffer类两种方法 1.StringBuffer sb = new StringBuffer(); 2.StringBuffer sb = new StringBuffer(“abc”)
(2)StringBuffer类 的append方法添加字符串的方法 sb.append(“<?xml version='1.0' encoding='UTF-8'?>”);
(3)StringBuffer的reverse方法将StringBuffer对象中的内容反转,然后形成新的字符串
(4)StringBuffer与String之间转换 1.StringBuffer转String:String s = sb.toString(); 2.String转StringBuffer:StringBuffer sb = new StringBuffer(String s);