最大数&&验证IP地址&&大数乘法

199 阅读2分钟

NC111 最大数

题目链接

1、解题思路

将数组封装到一个list中,然后对list中的数字进行排序。排序的思想是将权值大的数字排到前面。比如 4 > 12。其实就是4放到最高位,能产生更大的数字。

2、代码
import java.util.*;


public class Solution {
    /**
     * 最大数
     * @param nums int整型一维数组 
     * @return string字符串
     */
    public String solve (int[] nums) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            list.add(nums[i]);
        }
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                String s1 = String.valueOf(o1);
                String s2 = String.valueOf(o2);
                return (s1 + s2).compareTo(s2 + s1) * -1;
            }
        });
        StringBuilder sb = new StringBuilder();
        list.forEach(str -> sb.append(str));
        if (sb.charAt(0) == '0') {
            return "0";
        }
        return sb.toString();
    }
}

NC113 验证IP地址

题目链接

1、解题思路
# 就是普通的字符串处理,
1. IPv4中不能出现除0~9的其他字符,必须分割出4个,长度不为1的时候字符串头部不能为0
2. IPv6中单个16进制的长度不能大于4,
2、代码
import java.util.*;


public class Solution {
    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String ip) {
        if (ip.contains(".")) {
            String[] split = ip.split("\\.");
            if (split.length != 4) {
                return "Neither";
            } else {
                for (String s : split) {
                    if (s.length() != 1 && s.charAt(0) == '0') {
                        return "Neither";
                    }
                    for (int i = 0; i < s.toCharArray().length; i++) {
                        char c = s.charAt(i);
                        if (c < '0' || c > '9') {
                            return "Neither";
                        }
                    }
                    int val = Integer.parseInt(s);
                    if (val < 0 || val > 255) {
                        return "Neither";
                    }
                }
                return "IPv4";
            }
        }
        if (ip.contains(":")) {
            String[] split = ip.split(":");
            if (split.length != 8) {
                return "Neither";
            }
            for (String s : split) {
                if (s.length() > 4) {
                    return "Neither";
                }
                for (char c : s.toCharArray()) {
                    if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {
                        continue;
                    } else {
                        return "Neither";
                    }
                }
            }
            return "IPv6";
        }
        return "Neither";
    }
}

NC10 大数乘法

题目链接

1、解题思路

把每个字符相乘,把结果保存到数组中。然后数组中每个都保证一位就好,拼接数组中的元素就好。

2、代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        StringBuilder sb = new StringBuilder();
        String s1 = new StringBuilder(s).reverse().toString();
        String s2 = new StringBuilder(t).reverse().toString();
        int len1 = s1.length();
        int len2 = s2.length();
        int[] arr = new int[len1 + len2 + 3];
        for (int i = 0; i < len1; i++) {
            for (int j = 0; j < len2; j++) {
                int val1 = s1.charAt(i) - 48;
                int val2 = s2.charAt(j) - 48;
                arr[i + j] += val1 * val2;
            }
        }
        for (int i = 1; i < arr.length; i++) {
            int carry = arr[i-1] / 10;
            arr[i - 1] %= 10;
            arr[i] += carry;
        }
        int index = arr.length - 1;
        while (index > 0 && arr[index] == 0) {
            index--;
        }
        for (int i = 0; i <= index; i++) {
            sb.append(arr[i]);
        }
        return sb.reverse().toString();
    }
}