标签:int ary chars valueOf 670 力扣 length parseInt Integer
670. 最大交换
思路:
看到这题我第一反应就是想到下一个排列,不过很快发现这两题并没办法使用同一种思路,因为这一题是要求最大,且只能交换一次,相当于多了很多别的限制。
初步的思路是,直接将数组排序,然后和原来的数组从左往右不断对比,如果一样就下一位,如果不一样则往数组后面找到这个最大数,然后交换位置,交换完就直接break即可:
public int maximumSwap(int num) {
if(num<10) return num;
char[] ary = (num+"").toCharArray();
char[] copy = new char[ary.length];
System.arraycopy(ary,0,copy,0,ary.length);
Arrays.sort(copy);
for(int i=0;i<ary.length;i++){
char tmp = copy[ary.length-1-i];
if(ary[i]!=tmp){
int idx = i;
for(int j=i+1;j<ary.length;j++){
if(ary[j]==tmp) idx = j;
}
ary[idx] = ary[i];
ary[i] = tmp;
break;
}
}
return Integer.parseInt(new String(ary));
}
但是这样嵌套了两层循环而且发生了排序,实在不够优雅,因为我们还需要可以去找这个大数对应的索引,那么我们不如这样,我们记录每个数的后面(包括本身)的最大数值的索引,最后从左往右遍历数组观察是否最大数和当前数一样,若不一样则交换后break,若一样就下一位,这样就可以不用排序啦:
char[] chars = Integer.toString(num).toCharArray();
int maxIdx = chars.length - 1;
int[] maxArr = new int[chars.length];
for (int i = chars.length - 1; i >= 0 ; i--) {
if (chars[i] > chars[maxIdx]) {
maxIdx = i;
}
maxArr[i] = maxIdx;
}
for (int i = 0; i < chars.length; i++) {
if (chars[maxArr[i]] != chars[i]) {
char temp = chars[maxArr[i]];
chars[maxArr[i]] = chars[i];
chars[i] = temp;
break;
}
}
return Integer.parseInt(new String(chars));
这里顺带补充一下其他知识,parseInt和valueOf的区别:
1、返回值不同
parseInt 返回值是int型
valueof 返回值是Integer型
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
2、valueof就是调用了parseInt方法的
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
3、parseInt效率比valueof效率高
标签:int,ary,chars,valueOf,670,力扣,length,parseInt,Integer
来源: https://blog.csdn.net/qq_39879315/article/details/113794115
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。