- 题目详述
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
示例 2 :
输入: 9973
输出: 9973
解释: 不需要交换。
注意:
- 给定数字的范围是 [0, 108]
二.自我探寻(较慢)
思路:用一个list 把数分解了然后存进去,如98782,存进去是(倒序){
2,8,7,8,9}
然后从最高位开始 ,看它后面最大的值是否大于当前值,若大于,交换
不大于,到下一位。
代码:class Solution {
public int maximumSwap(int num) {
List<Integer> aIntegers=new ArrayList<Integer>();
int f=num;
while(f!=0)
{
int q=f%10;
f=f/10;
aIntegers.add(q);
}
for(int i=aIntegers.size()-1;i>=0;i--)
{
int max=0;
int t=0;
for(int j=i-1;j>=0;j--)
{
if(aIntegers.get(j)>=max)
{
max=aIntegers.get(j);
t=j;
}
}
if(max>aIntegers.get(i))
{
int a=aIntegers.get(i);
aIntegers.set(t, a);
aIntegers.set(i,max);
break;
}
}
int c=0;
int n=1;
for(int m=0;m<aIntegers.size();m++)
{
c=c+aIntegers.get(m)*n;
n=n*10;
}
return c;
}
}
评价:
三.网络学习过程
思路:1.将num直接转成字符串 Integer.toString(num)
- 将字符串转成字符数组Integer.toString(num).toCharArray();
- 用一个数组存取 每一位在数组中的位置(极大减少时间,不用每一位循环求后面的极大值)
代码:public static int maximumSwap(int num) {
char[] a=Integer.toString(num).toCharArray();
int[] last=new int[10];
for(int i=0;i<a.length;i++)
{
last[a[i]-'0']=i;
}
for(int i=0;i<a.length;i++)
{
for(int k=9;k>a[i]-'0';k--)
{
if(last[k]>i)
{
char tmp=a[i];
a[i]=a[last[k]];
a[last[k]]=tmp;
return Integer.valueOf(new String(a));
}
}
}
return num;
}
评价:
四.Python实现