最大值

前几天参加了下猿题库的笔试,第一道算法题当时没有想出思路,题目大致如下:
**最大值** 
给出一个由0~9数字构成的字符串s,重新排列数字的顺序并将字符串拆分成两个非负整数a、b(可包含前缀0), 求a+b的最大值
补全函数cal(s),传入字符串s,返回a+b的最大值的字符串  数据范围2<=|s|<=1000

今天有空仔细想了下,采用下面的思路应该是可行的:
1、将输入的字符串s转化为整数链表;
2、对整数链表按从大到小排序;
3、分析题意,可知当S2选取为s中最小的整数,剩余部分为S1时,所得的值最大。据此可得两个字符串;
4、接下来采用链表整数相加的方式,求和;如果最高位有进位(最多进1位),需要增加最高进位;
5、如果最高位都是0,则值为0,返回“0”;
6、返回转化为字符串后的结果
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
 * 最大值 
 * 给出一个由0~9数字构成的字符串s,重新排列数字的顺序并将字符串拆分成两个非负整数a、b(可包含前缀0), 求a+b的最大值
 * 补全函数cal(s),传入字符串s,返回a+b的最大值的字符串  数据范围2<=|s|<=1000
 * @author huangxw
 *
 */
public class Cal {
    public static void main(String[] args){
        //test instance
        //String s = "9999999999999991";
        //String s = "000";
        //String s = "123";
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String ret = cal(s);
        System.out.println("ret value is = " + ret);
    }

    public static String cal(String s){
        if (s==null && s.length()<2)
            return null;
        //change to integer
        List<Integer> list = new ArrayList<Integer>();
        for(int i=0; i<s.length(); i++){
            list.add(s.charAt(i)-'0');
        }
        System.out.println("list value is = " + list);
        //sort the list of numbers, decrease, ex. 99991
        for(int i=0; i<list.size(); i++){
            for(int j=i+1; j<list.size(); j++){
                if(list.get(j)>list.get(i)){
                    //swap
                    int temp = list.get(i);
                    list.set(i, list.get(j));
                    list.set(j, temp);
                }
            }
        }
        //min = last character of list
        int min = list.get(list.size()-1);
        //original string without last character
        list.remove(list.size()-1);
        //carry list and min to be a new string
        List<Integer> array = new ArrayList<Integer>();
        //min just plus once
        int carry = (list.get(list.size()-1) + min)/10;
        array.add((list.get(list.size()-1)+min)%10);
        //carry plus every time
        for(int k=list.size()-2; k>=0; k--){
            carry = (list.get(k) + carry)/10;
            array.add((list.get(k) + carry)%10);
        }
        //highest number is special
        if(carry!=0){
            array.add(carry);
        }
        //all zeros situation
        if(array.get(array.size()-1)==0)
            return "0";
        //change to string
        String ret = "";
        for(int m=array.size()-1; m>=0; m--){
            ret = ret + array.get(m);
        }
        return ret;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值