月度归档:2017年03月

把数组排成最小的数

题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

思路

排序,然后拼接
重点在于比较函数
一开始写了一个好麻烦,却又无效的比较方法,后来看了下别人的比较函数,发现简单多了,我真是把问题复杂化了,以下是不正确的代码

import java.util.Arrays;
import java.util.Comparator;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
        String[] arr = new String[numbers.length];
        for(int i=0;i<arr.length;i++){
            arr[i]=numbers[i]+"";
        }
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                int len1=s1.length();
                int len2=s2.length();
                int lim = Math.min(len1, len2);
                char[] str1=s1.toCharArray();
                char[] str2=s2.toCharArray();
                for(int i=0;i<lim;i++){
                    if(len1==len2){
                        int j=0;
                        while (j<lim){
                            if(str1[j]!=str2[j]){
                                return str1[j]-str2[j];
                            }
                        }
                        return 0;
                    }else {
                        int j=0;
                        while (j<lim){
                            if(str1[j]!=str2[j]){
                                return str1[j]-str2[j];
                            }
                            j++;
                        }
                        if(len1>len2){
                            String str3=s1.substring(len2);
                            return compare(str3,s2);
                            //return str3.compareTo(s2);
                        }else {
                            String str3=s2.substring(len1);
                            //return str3.compareTo(s1);
                            return compare(str3,s1);
                        }
                    }
                }
                return 0;
            }
        });
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<arr.length;i++){
            sb.append(arr[i]);
        }
        return sb.toString();
    }
}

实际上,在比较两个字符串的时候,之间把两个字符串以不同顺序拼接,再进行比较就好。这道题真长知识了。

正确代码

import java.util.Arrays;
import java.util.Comparator;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
        String[] arr = new String[numbers.length];
        for(int i=0;i<arr.length;i++){
            arr[i]=numbers[i]+"";
        }
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                String str1=s1+s2;
                String str2=s2+s1;
                return str1.compareTo(str2);
            }
        });
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<arr.length;i++){
            sb.append(arr[i]);
        }
        return sb.toString();
    }
}

java错题集

下列 java 程序输出结果为______。

int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));

实际输出结果为

true
true

本题是一个自动拆装箱的考题(自动拆装箱JDK需在1.5上)
1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;
2、两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。
3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。

参考:https://www.nowcoder.com/test/question/done?tid=7352097&qid=25372#summary

把字符串转换成整数

题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空

输出描述:

如果是合法的数值表达则返回该数字,否则返回0

输入例子:

+2147483647
1a33

输出例子:

2147483647
0

思路

  • 非法字符
  • 大于整形最大值
  • 小于整形最小值
  • 可能为负数
  • 整数的时候可能有负号可能没负号

代码如下

public class Solution {
    public int StrToInt(String str) {
        if(str == null || str.length() == 0 || str.length()>12)return 0;

        long res=0;
        boolean isPositive=true;

        //检查字符合法性
        for(int i=0;i<str.length();i++){
            char c = str.charAt(i);
            if((c>='0'&&c<='9')||c=='+'||c=='-'){

            }else {
                return 0;
            }
        }
        int i = 0;
        if(str.charAt(0)=='-'){
            //负数
            i++;
            isPositive=false;
        }else if(str.charAt(0)=='+'){
            //整数
            i++;
        }
        for(;i<str.length();i++){
            char c = str.charAt(i);
            if(c>='0'&&c<='9'){
                res = res * 10 + str.charAt(i)-'0';
            }else {
                return 0;
            }
        }
        if(!isPositive){
            res=-res;
        }
        if(res>Integer.MAX_VALUE || res<Integer.MIN_VALUE){
            return 0;
        }
        return (int) res;
    }
}