为了进字节跳动,我精选了29道Java经典算法题,带详细讲解
发布于 2019-10-26    2,079 次阅读
前言: 如题,很多粉丝私信,让分享一些算法面试题,今天他来了;精选29道Java经典算法面试题,并且做了详细的讲解,希望能够帮助到大家! Java经典算法题 1. Java 的 16 进制与字符串的相互转换函数 /** * 将指定 byte 数组以 16 进制的形式打印到控制台 * @param hint String * @param b byte[] * @return ...

前言:

如题,很多粉丝私信,让分享一些算法面试题,今天他来了;精选29道Java经典算法面试题,并且做了详细的讲解,希望能够帮助到大家!

Java经典算法题

1. Java 的 16 进制与字符串的相互转换函数

/**
        * 将指定 byte 数组以 16 进制的形式打印到控制台
 * @param hint String
 * @param b byte[]
 * @return void
*/
public static void printHexString(String hint, byte[] b) {
    System.out.print(hint);
    for (int i = 0; i < b.length; i++) {
        String hex = Integer.toHexString(b[i] & 0xFF);
        if (hex.length() == 1) {
            hex = '0' + hex;
        }
        System.out.print(hex.toUpperCase() + " ");
    }
    System.out.println("");
}
/**
*
* @param b byte[]
* @return String
*/
public static String Bytes2HexString(byte[] b) {
    String ret = "";
    for (int i = 0; i < b.length; i++) {
        String hex = Integer.toHexString(b[i] & 0xFF);
        if (hex.length() == 1) {
            hex = '0' + hex;
        }
        ret += hex.toUpperCase();
    }
    return ret;
}
/**
* 将两个 ASCII 字符合成一个字节;
* 如:"EF"--> 0xEF
* @param src0 byte
* @param src1 byte
* @return byte
*/
public static byte uniteBytes(byte src0, byte src1) {
    byte _b0 = byte.decode("0x" + new String(new byte[]{src0})).byteValue();
    _b0 = (byte)(_b0 << 4);
    byte _b1 = byte.decode("0x" + new String(new byte[]{src1})).byteValue();
    byte ret = (byte)(_b0 ^ _b1);
    return ret;
}
/**
* 将指定字符串 src,以每两个字符分割转换为 16 进制形式
* 如:"2B44EFD9" --> byte[]{0x2B, 0x44, 0xEF, 0xD9}
* @param src String
* @return byte[]
               */
public static byte[] HexString2Bytes(String src){
    byte[] ret = new byte[8];
    byte[] tmp = src.getBytes();
    for (int i=0; i<8; i++){
        ret[i] = uniteBytes(tmp[i*2], tmp[i*2+1]);
    }
    return ret;
}

2. JAVA 时间格式化处理

import java.util.Date;
import java.text.SimpleDateFormat;
class dayTime
{
    public static void main(String args[])
    {
        Date nowTime=new Date();
        System.out.println(nowTime);
        SimpleDateFormat time=new SimpleDateFormat("yyyy MM dd HH mm ss");
        System.out.println(time.format(nowTime));
    }
}

3. 将毫秒转化为日期

public static void main(String[] args) {
    new ConvertLong2Date().launchFrame();
}
public String convertL2D(long l) {
    long _l = 0L;
    Date _d = null;
    SimpleDateFormat _sdf = null;
    String _s = null;
    _l = l;
    _d = new Date(_l);
    _sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    _s = _sdf.format(_d);
    return _s;
}

4. 文本的倒序输出

文件 before:

Hello
World

要求输出文件 after:

World
Hello

代码如下:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.ListIterator;
public class ReverseOrder extends ArrayList {
    public static String read(String fileName) throws IOException {
        StringBuffer sb = new StringBuffer();
        LinkedList lines = new LinkedList();
        BufferedReader in = new BufferedReader(new FileReader(fileName));
        String s;
        while ((s = in.readLine()) != null)
        lines.add(s);
        in.close();
        ListIterator it = lines.listIterator(lines.size());
        while (it.hasPrevious()) {
            sb.append(it.previous());
            sb.append("n");
}
return sb.toString();
}
public static void write(String fileName, String text) throws IOException { PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(
fileName)));
out.print(text);
out.close();
}
public ReverseOrder(String fileName) throws IOException { super(Arrays.asList(read(fileName).split("n")));
}
public void write(String fileName) throws IOException {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter( fileName)));
for (int i = 0; i < size(); i++)
out.println(get(i));
out.close();
}
public static void main(String[] args) throws Exception { String fileName = "e:\1124\before.txt";
ReverseOrder text = new ReverseOrder(fileName);
text.write("e:\1124\after.txt");
}
/*
* 最后会多一个空行,手工删除一下
*/
}

5. 判断一个数字是奇数还是偶数

判断一个数是否是奇数:

public static Boolean isOdd(int i) {
    return (i&1) != 0;
}

判断一个数是否是偶数

public static Boolean isEven(int i) {
    return (i&1) = 0;
}
//位运算符说明在 java 文件夹里面

6. 用Hibernate 实现分页

public List queryByStatus(int status, int currentPage, int lineSize)
throws Exception {
    List all = null;
    String hql = "FROM Question AS q WHERE q.status=? ORDER BY q.questiontime desc";
    Query q = super.getSession().createQuery(hql);
    q.setInteger(0, status);
    q.setFirstResult((currentPage - 1) * lineSize);
    q.setMaxResults(lineSize);
    all = q.list();
    return all;
}

7. 35 选 7 彩票程序

public class caipiao
{
    static void generate()
    {
        int a[]=new int[7];
        int i,m,j;
        fan:for (j=0;j <7;j++){
            //外循环实现随机生成每组 7 个数
            a[j]=(int)(Math.random()*35+1);
            m=a[j];
            if(j>=1){
                for (i=0;i <j;i++)//内循环实现无重复
                if(a[i]==m){
                    j--;
                    continue fan;
                }
            }
            if(a[j] <10)
            System.out.print("0"+a[j]+"  "); else
            System.out.print(a[j]+"  ");
        }
    }
    public static void main (String args[]){
        int n=Integer.parseint(args[0]);
        System.out.println("中国福利彩票 35 选 7");
        for (int i=0;i <n;i++){
            //循环调用方法实现输出 n 组数
            generate();
            System.out.println();
        }
    }
}

8. 获取 GMT8 时间

/**
* Description: 获取 GMT8 时间
* @return 将当前时间转换为 GMT8 时区后的 Date */
public static Date getGMT8Time(){
    Date gmt8 = null;
    try {
        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"),Locale.CHINESE);
        Calendar day = Calendar.getInstance();
        day.set(Calendar.YEAR, cal.get(Calendar.YEAR));
        day.set(Calendar.MONTH, cal.get(Calendar.MONTH));
        day.set(Calendar.DATE, cal.get(Calendar.DATE));
        day.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY));
        day.set(Calendar.MINUTE, cal.get(Calendar.MINUTE));
        day.set(Calendar.SECOND, cal.get(Calendar.SECOND));
        gmt8 = day.getTime();
    }
    catch (Exception e) {
        System.out.println("获取 GMT8 时间 getGMT8Time() error !");
        e.printStackTrace();
        gmt8 = null;
    }
    return  gmt8;
}

9. 中文乱码转换

public String china(String args)
{
    String s=null;
    String s=new String(args.getBytes("ISO-8859-1"),"gb2312");
    return s;
}

10. 小标签

import java.io.IOException;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import com.formcontent.show.ShowFormTypeOperateDb;
import com.forum.hibernatePrj.Space;
public class OutPrintForumType extends TagSupport{
    public int doStartTag() throws JspException
    {
        String printStr="";
        ShowFormTypeOperateDb showtype=new ShowFormTypeOperateDb();
        List list=showtype.getForumType();
        if(list!=null&&list.size()>0)
        {
            for (int i=0;i <list.size();i++)
            {
                Space space=(Space)list.get(i);
                if(space!=null)
                {
                    printStr+=" <tr> <td>"+" <div align='left' class='TypeCss'>"+
                    space.getSpaceName()+" "+space.getSpaceDescription()+" <br/>目前登陆总人数:"+i+" 人访问数:"+i+"人 </div> </td> </tr>"
                    +" <tr> <td> </td> </tr>";
                }
            }
        }
        try {
            pageContext.getOut().write(printStr);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        return super.doStartTag();
    }
}

11. Big5 字与 Unicode 的互换

/**
* Big5 字与 Unicode 的互换
* 转换后的正常字型
*/
import java.io.*;
public class MyUtil{
    public static String big5ToUnicode(String s){
        try{
            return new String(s.getBytes("ISO8859_1"), "Big5");
        }
        catch (UnsupportedEncodingException uee){
            return s;
        }
    }
    public static String UnicodeTobig5(String s){
        try{
            return new String(s.getBytes("Big5"), "ISO8859_1");
        }
        catch (UnsupportedEncodingException uee){
            return s;
        }
    }
    public static String toHexString(String s){
        String str="";
        for (int i=0; i<s.length(); i++){
            int ch=(int)s.charAt(i);
            String s4="0000"+Integer.toHexString(ch);
            str=str+s4.substring(s4.length()-4)+" ";
        }
        return str;
    }
}

12. 取得服务器当前的各种具体时间

/**
* 取得服务器当前的各种具体时间
* 回车:日期时间
*/
import java.util.*;
public class GetNowDate{
    Calendar  calendar = null;
    public GetNowDate(){
        calendar = Calendar.getInstance();
        calendar.setTime(new Date());
    }
    public int getYear(){
        return calendar.get(Calendar.YEAR);
    }
    public int getMonth(){
        return 1 + calendar.get(Calendar.MONTH);
    }
    public int getDay(){
        return calendar.get(Calendar.DAY_OF_MONTH);
    }
    public int getHour(){
        return calendar.get(Calendar.HOUR_OF_DAY);
    }
    public int getMinute(){
        return calendar.get(Calendar.MINUTE);
    }
    public int getSecond(){
        return calendar.get(Calendar.SECOND);
    }
    public String getDate(){
        return getMonth()+"/"+getDay()+"/"+getYear();
    }
    public String getTime(){
        return getHour()+":"+getMinute()+":"+getSecond();
    }
    public String getDate2(){
        String yyyy="0000", mm="00", dd="00";
        cy = yyyy + getYear();
        mm = mm + getMonth();
        dd = dd + getDay();
        cy = yyyy.substring(yyyy.length()-4);
        mm = mm.substring(mm.length()-2);
        dd = dd.substring(dd.length()-2);
        return yyyy + "/" + mm + "/" + dd;
    }
    public String getTime2(){
        String hh="00", mm="00", ss="00";
        ah = hh + getHour();
        mm = mm + getMinute();
        ss = ss + getSecond();
        hh = hh.substring(hh.length()-2, hh.length());
        mm = mm.substring(mm.length()-2, mm.length());
        ss = ss.substring(ss.length()-2, ss.length());
        return hh + ":" + mm + ":" + ss;
    }
}

13. 用半角的特殊符号代替全角的特殊符号

/**
* 用半角的特殊符号代替全角的特殊符号
* 防止特殊字符在传输参数时出现错误
*/
public class ReplaceStrE{
    public static String rightToError(String ss){
        String strs;
        String strs1;
        String strs2;
        String strs3;
        String strs4;
        try{
            strs = ss.replace('#','#');
        }
        catch(Exception ex){
            return ss;
        }
        try{
            strs1 = strs.replace('"','"');
        }
        catch(Exception ex){
            return strs;
        }
        try{
            strs2 = strs1.replace('  ','&');
        }
        catch(Exception ex){
            return strs1;
        }
        try{
            strs3 = strs2.replace('+','+');
        }
        catch(Exception ex){
            return strs2;
        }
        try{
            strs4 = strs3.replace(''',''');
}
catch(Exception ex){
return ss;
}
return strs4;
}
}

14. 数组和数组之间的转换代码

import java.lang.reflect.Array;
import java.util.Date;
public class TestCast {
    /** 
* 将数组 array 转换成 clss 代表的类型后返回
* @param array 需要转换的数组
* @param clss  要转换成的类型
* @return  转换后的数组
*/
    public  static Object cast(Object array,Class clss){
        if(null==clss)
        throw new IllegalArgumentException("argument clss cannot be null");
        if(null==array)
        throw new IllegalArgumentException("argument array cannot be null");
        if(false==array.getClass().isArray())
        throw new IllegalArgumentException("argument array must be array");
        Object[] src=(Object[])array;
        Object[] dest=(Object[])Array.newInstance(clss, src.length);
        System.arraycopy(src, 0, dest, 0, src.length);
        return dest;
    }
}

15. 从资源文件里读取值的类

从资源文件里读取值的类,文件后缀不一定要.Properties,只要里面内容如:url=www.cnsec.net可通过 key(url)取得值-www.cnsec.net,简单、强大

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
/**
* ReadProperties.java
* Description: 读取操作属性配置文件
* @author li.b
* @version 2.0
* Jun 26, 2008
*/
public class ReadProperties {
    /**
* Description: 获取属性配置文件
* @param path 资源文件路径
* @return Properties Object
* @throws FileNotFoundException
* @throws IOException
*/
    public static Properties getProperties(String path) throws FileNotFoundException, IOException{
        Properties props = null;
        File file = new File(path);
        if(file.exists() && file.isFile()){
            props = new Properties();
            props.load(new FileInputStream(file));
        } else{
            System.out.println(file.toString() + "不存在!");
        }
        return props;
    }
    /**
* Description: 从属性文件获取值
* @param props Properties Object
* @param key
* @return 通过 key 匹配到的 value
*/
    public static String getValue(Properties props,String key,String encod){
        String result = "";
        String en = "";
        String localEN = System.getProperty("file.encoding");
        if(encod !=null && !encod.equals("") ){
            en = encod;
        } else{
            en = localEN;
        }
        try {
            key = new String(key.getBytes(en),"ISO-8859-1");
            result = props.getProperty(key);
            if(!result.equals("")){
                result = new String(result.getBytes("ISO-8859-1"),en);
            }
        }
        catch (Exception e) {
        }
        finally{
            if(result == null)result = "";
            return result;
        }
    }
    public static String getValue(Properties props,String key){
        return getValue(props, key, "");
    }
}

16. 一个随机类

/*
* @author www.wuliaokankan.cn
* Copyright (C) 2007 
* All rights reserved.
*/
package com.dextrys.trilogy.util;
import java.util.Arrays;
import org.eclipse.swt.graphics.RGB;
public class RandomUtil
{
    /**
* @param args */
    public static void main( String[] args )
    {
        //System.out.println( getRandomNormalString( 8 ) );
        int[] test = getRandomIntWithoutReduplicate( 0, 40, 39 );
        Arrays.sort( test );
        for ( int i : test )
        {
            System.out.println( i );
        }
    }
    /**
* get a integer array filled with random integer without reduplicate [min, max)
* @param min the minimum value
  * @param max the maximum value
  * @param size the capacity of the array
     * @return a integer array filled with random integer without redupulicate */
    public static int[] getRandomIntWithoutReduplicate( int min, int max, int size )
    {
        int[] result = new int[size];
        int arraySize = max - min;
        int[] intArray = new int[arraySize];
        // init intArray
        for ( int i = 0 ; i < intArray.length ; i++ )
        {
            intArray[i] = i + min;
        }
        / get randome interger without reduplicate for ( int i = 0 ; i < size ; i++ )
        {
            int c = getRandomint( min, max - i );
            int index = c - min;
            swap( intArray, index, arraySize - 1 - i );
            result[i] = intArray[ arraySize - 1 - i ];
        }
        return result;
    }
    private static void swap( int[] array, int x, int y )
    {
        int temp = array[x];
        array[x] = array[y];
        array[y] = temp;
    }
    /**
* get a random Integer with the range [min, max)
* @param min the minimum value
* @param max the maximum value
* @return the random Integer value
*/
    public static int getRandomint( int min, int max )
    {
        // include min, exclude max
        int result = min + new double( Math.random() * ( max - min ) ).intValue();
        return result;
    }
    /**
* get a random double with the range [min, max)
* @param min the minimum value
* @param max the maximum value
* @return the random double value
*/
    public static double getRandomdouble( double min, double max )
    {
        // include min, exclude max
        double result = min + ( Math.random() * ( max - min ) );
        return result;
    }
    /**
*
* @return a random char with the range ASCII 33(!) to ASCII 126(~) */
    public static char getRandomchar()
    {
        / from ASCII code 33 to ASCII code 126 int firstchar = 33;
        // "!"
        int lastchar = 126;
        // "~"
        char result = ( char ) ( getRandomint( firstchar, lastchar + 1 ) );
        return result;
    }
    /**
*
* @return a random rgb color */
    public static RGB getRandomRGB()
    {
        int red = getRandomint(0,256);
        int green = getRandomint(0,256);
        int blue = getRandomint(0,256);
        return new RGB( red, green, blue );
    }
    /**
*
* @return a random char with the range [0-9],[a-z],[A-Z] */
    public static char getRandomNormalchar()
    {
        // include 0-9,a-z,A-Z
        int number = getRandomint( 0, 62 );
        int zerochar = 48;
        int ninechar = 57;
        int achar = 97;
        int zchar = 122;
        int Achar = 65;
        int Zchar = 90;
        char result;
        if( number < 10 )
        {
            result = ( char ) ( getRandomint( zerochar, ninechar + 1 ) );
            return result;
        } else if( number >= 10 && number < 36 )
        {
            result = ( char ) ( getRandomint( Achar, Zchar + 1 ) );
            return result;
        } else if( number >= 36 && number < 62 )
        {
            result = ( char ) ( getRandomint( achar, zchar + 1 ) );
            return result;
        } else
        {
            return 0;
        }
    }
    /**
*
* @param length the length of the String
* @return a String filled with random char */
    public static String getRandomString( int length )
    {
        / include ASCII code from 33 to 126 StringBuffer result = new StringBuffer();
        for ( int i = 0; i < length; i++ )
        {
            result.append( getRandomchar() );
        }
        return result.toString();
    }
    /**
*
* @param length the length of the String
* @return a String filled with normal random char */
    public static String getRandomNormalString( int length )
    {
        // include 0-9,a-z,A-Z
        StringBuffer result = new StringBuffer();
        for ( int i = 0; i < length; i++)
        {
            result.append( getRandomNormalchar() );
        }
        return result.toString();
    }
}

17. 计算传入值是否星期六

/**
* 计算传入值是否星期六
* 回车:true  or  false
*/
import java.util.*;
public class Week6 {
    public Boolean checkWeek6(String str){
        Boolean flag=false;
        int week6=0;
        str.replace('/','-');
        Calendar cal=Calendar.getInstance();
        cal.setTime(java.sql.Date.valueOf(str.substring(0,10)));
        week6=cal.get(Calendar.DAY_OF_WEEK);
        if(week6==7){
            flag=true;
        }
        return flag;
    }
}

18. 转换文件大小

import java.text.DecimalFormat;
import java.util.Hashtable;
/**
* 文件大小单位转换
* @author Administrator
*/
public class UnitsConversion extends DecimalFormat {
    private static final long serialVersionUID = 3168068393840262910L;
    /**
* 存放有效单位的数组
*/
    private static Hashtable<String, String> validUnits = new Hashtable<String, String>();
    /**
* 限制文件大小上限为 1G
*/
    private static int GB_MAX_SIZE = 1;
    /**
* 最大的 MB 值
*/
    private static int MB_MAX_SIZE = GB_MAX_SIZE * 1024;
    /**
* 最大的 KB 值
*/
    private static int KB_MAX_SIZE = MB_MAX_SIZE * 1024;
    /**
* 最大的 Bytes 值
*/
    private static int BYTES_MAX_SIZE = KB_MAX_SIZE * 1024;
    /**
* 数字部分的值
*/
    private double numPart;
    /**
* 原始的单位字符串
*/
    private String originalUnit;
    /**
* 标准的单位字符串
*/
    private String unit;
    /**
* 转换后的结果
*/
    private String result;
    / 添加所有有效单位 static {
        validUnits.put("字节", "Bytes");
        validUnits.put("bytes", "Bytes");
        validUnits.put("byte", "Bytes");
        validUnits.put("kb", "KB");
        validUnits.put("k", "KB");
        validUnits.put("兆", "MB");
        validUnits.put("mb", "MB");
        validUnits.put("m", "MB");
        validUnits.put("gb", "GB");
        validUnits.put("g", "GB");
    }
    /**
* 构造方法:指定了数字格式,初始所有属性为 NULL
*/
    public UnitsConversion() {
        super("########.##");
        numPart = null;
        result = null;
        unit = null;
        originalUnit = null;
    }
    /**
* 根据单位、数字大小按照常用的转换原则进行转换
* @param input
* @return 成功转换后的结果是非空字符串;若失败了,结果为空字符串
*/
    public String defaultConversion(String input) {
        analyzeString(input);
        if (result != null) {
            return result;
        }
        // 单位 Bytes
        if (unit.equals("Bytes")) {
            int numPart2int = numPart.intValue();
            / 输入大小与 1G 相差 0.5M 之内,返回 1GB
            if ((BYTES_MAX_SIZE - numPart2int) < (1024 * 1024) / 2) {
                return "1 GB";
            }
            // (0,1KB)
            if (numPart2int < 1024) {
                return numPart2int + " Bytes";
            }
            // [1KB,1023KB]
            if (numPart2int >= 1024 && numPart2int <= (1024 - 1) * 1024) {
                return format(numPart / 1024) + " KB";
            }
            // (1023KB,1GB)
            if (numPart2int > (1024 - 1) * 1024 && numPart2int < BYTES_MAX_SIZE) {
                return format(numPart / (1024 * 1024)) + " MB";
            } else
            result = "";
            return result;
        }
        if (unit.equals("KB")) {
            return "还没实现....";
        }
        if (unit.equals("MB")) {
            return "还没实现....";
        }
        if (unit.equals("GB")) {
            return "还没实现....";
        }
        result = "";
        return result;
    }
    /** * 把字符串的数字部分与单位分离,并对数字、单位的有效性进行检验, 若有非法状况,把结果赋值为 "" ,将其返回给用户 * * @param input
*/
    public void analyzeString(String input) {
        / 初步检验输入的字符串
        if (input == null || input.trim().length() < 2) {
            System.out.println("输入的字符串有误");
            result = "";
            return;
        }
        input = input.replaceAll(" ", "");
        int firstIndexOfUnit;
        // 单位的起始位置
        String strOfNum;
        // 数字部分的字符串
        / 从尾部开始遍历字符串
        for (int i = input.length() - 1; i >= 0; i--) {
            if (Character.isDigit(input.charAt(i))) {
                firstIndexOfUnit = i + 1;
                originalUnit = input.substring(firstIndexOfUnit,
                input.length()).toLowerCase();
                if (!isValidUnit(originalUnit)) {
                    System.out.println("无效单位。");
                    result = "";
                    return;
                }
                unit = validUnits.get(originalUnit);
                strOfNum = input.substring(0, firstIndexOfUnit);
                numPart = double.parsedouble(strOfNum);
                if (!isValidNum(numPart, unit)) {
                    System.out.println("文件大小非法");
                    result = "";
                    return;
                }
                if (numPart == 0) {
                    result = "0 Bytes";
                    return;
                }
                break;
            }
        }
        if (unit == null || numPart == null) {
            System.out.println("输入的字符串有误");
            result = "";
            return;
        }
    }
    /**
* 文件大小越界检查
* 
* @param num
* @param unit
* @return 在 1G 范围内(包括 1G),返回 true;否则返回 false */
    public Boolean isValidNum(double num, String unit) {
        if (num == null || num < 0 || num > BYTES_MAX_SIZE) {
            return false;
        }
        if (unit.equals("KB") && num > KB_MAX_SIZE) {
            return false;
        }
        if (unit.equals("MB") && num > MB_MAX_SIZE) {
            return false;
        }
        if (unit.equals("GB") && num > GB_MAX_SIZE) {
            return false;
        }
        return true;
    }
    /**
* 检查原始单位 originalUnit 是否有效
* 
* @param originalUnit
* @return 若 originalUnit 为空,那么会给他赋默认值 bytes ,并返回 true;<br>
* 若 originalUnit 是有效单位集合中之一,返回 true。
*/
    public Boolean isValidUnit(String originalUnit) {
        if (originalUnit == null || originalUnit.trim().length() < 1) {
            originalUnit = "bytes";
            return true;
        }
        for (String validUnit : validUnits.keySet()) {
            if (validUnit.equalsIgnoreCase(originalUnit)) {
                return true;
            }
        }
        return false;
    }
    //测试
    public static void main(String[] args) {
        System.out.println("-------------");
        for (int i = 1020 * 1024; i <= 1024 * 1111; i += 9) {
            String input = i + " ";
            System.out.println(input + " ---> "
            + new UnitsConversion().defaultConversion(input));
        }
    }
}

19. Java 日期格式化及其使用例子

①. SimpleDateFormat 担当重任,怎样格式化都行

import java.util.Date;
import java.text.SimpleDateFormat;
public class Demo
{
    public static void main(String[] args)
    {
        Date now=new Date();
        SimpleDateFormat f=newSimpleDateFormat("今天是"+"yyyy 年 MM 月 dd 日 E kk 点 mm 分");
        System.out.println(f.format(now));
        f=new SimpleDateFormat("a hh 点 mm 分 ss 秒");
        System.out.println(f.format(now));
    }
}

②. 从字符串到日期类型的转换

import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.text.*;
publicclass Demo
{
    public static void main(String[] args)
    {
        String strDate="2005 年 04 月 22 日";
        //注意:SimpleDateFormat 构造函数的样式与 strDate 的样式必须相符
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy 年 MM 月 dd 日");
        //必须捕获异常
        try
        {
            Date date=simpleDateFormat.parse(strDate);
            System.out.println(date);
        }
        catch(ParseException px)
        {
            px.printStackTrace();
        }
    }
}

③. 将毫秒数换转成日期类型

import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.text.*;
public class Demo
{
    public static void main(String[] args)
    {
        long now=System.currentTimeMillis();
        System.out.println("毫秒数:"+now);
        Date dNow=new Date(now);
        System.out.println("日期类型:"+dNow);
    }
}

④. 获取系统时期和时间,转换成 SQL 格式后更新到数据库

java.util.Date d=new java.util.Date();
//获取当前系统的时间
//格式化日期
new java.text.SimpleDateFormat s= new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = s.format(d);
//转为字符串
使用 RS 更新数据库,仍然要用 rs.updateString,而不是 rs.updateDade。 rs.updateString("regtime",dateStr);
//regtime 字段为 datetime 类型的

⑤. 按本地时区输出当前日期

Date myDate = new Date();
System.out.println(myDate.toLocaleString());

输出结果为:

2003-5-30

⑥. 如何格式化小数

DecimalFormat df = new DecimalFormat(",###.00");
double aNumber = 33665448856.6568975;
String result = df.format(aNumber);
Sytem. out.println(result);

输出结果为:

33,665,448,856.66

其他:获取毫秒时间 System.currentTimeMillis();

⑦. 在数据库里的日期只以年-月-日的方式输出

定义日期格式:

SimpleDateFormat sdf = new SimpleDateFormat(yy-MM-dd);

sql 语句为:

String sqlStr = "select bookDate from roomBook where bookDate between '2007-4-10' and '2007-4-25'";

输出:

System.out.println(df.format(rs.getDate("bookDate")));

20. java几个常用方法

字符串

①. 获取字符串的长度

length()

②. 判断字符串的前缀或后缀与已知字符串是否相同前缀 startsWith(String s)

后缀 endsWith(String s)

③. 比较两个字符串 equals(String s)

④. 把字符串转化为相应的数值 int 型 Integer.parseInt(字符串) long 型 Long.parseLong(字符串)

float 型 Folat.valueOf(字符串).floatValue() double 型 Double.valueOf(字符串).doubleValue()

⑤. 将数值转化为字符串valueOf(数值)

⑥. 字符串检索

indexOf(Srting s) 从头开始检索

indexOf(String s ,int startpoint) 从 startpoint 处开始检索如果没有检索到,将返回-1

⑦. 得到字符串的子字符串

substring(int startpoint) 从 startpoint 处开始获取 substring(int start,int end) 从 start 到 end 中间的字符

⑧. 替换字符串中的字符,去掉字符串前后空格

replace(char old,char new) 用 new 替换 oldtrim()

⑨. 分析字符串

StringTokenizer(String s) 构造一个分析器,使用默认分隔字符(空格,换行,回车,Tab,进纸符) StringTokenizer(String s,String delim) delim 是自己定义的分隔符

nextToken() 逐个获取字符串中的语言符号

boolean hasMoreTokens() 只要字符串还有语言符号将返回 true,否则返回 false countTokens() 得到一共有多少个语言符号

Java 中的鼠标和键盘事件

①. 使用 MouseListener 借口处理鼠标事件

鼠标事件有 5 种:按下鼠标键,释放鼠标键,点击鼠标键,鼠标进入和鼠标退出鼠标事件类型是 MouseEvent,主要方法有:

  • getX(),getY() 获取鼠标位置
  • getModifiers() 获取鼠标左键或者右键
  • getClickCount() 获取鼠标被点击的次数
  • getSource() 获取鼠标发生的事件源
    • 事件源获得监视器的方法是 addMouseListener(),移去监视器的方法是 removeMouseListener() 处理事件源发生的时间的事件的接口是 MouseListener 接口中有如下的方法 mousePressed(MouseEvent) 负责处理鼠标按下事件 mouseReleased(MouseEvent) 负责处理鼠标释放事件
  • mouseEntered(MouseEvent) 负责处理鼠标进入容器事件
  • mouseExited(MouseEvent) 负责处理鼠标离开事件
  • mouseClicked(MouseEvent) 负责处理点击事件

②. 使用 MouseMotionListener 接口处理鼠标事件

事件源发生的鼠标事件有 2 种:拖动鼠标和鼠标移动

  • 鼠标事件的类型是 MouseEvent
  • 事件源获得监视器的方法是 addMouseMotionListener()
  • 处理事件源发生的事件的接口是 MouseMotionListener 接口中有如下的方法
  • mouseDragged() 负责处理鼠标拖动事件
  • mouseMoved() 负责处理鼠标移动事件

③. 控制鼠标的指针形状

setCursor(Cursor.getPreddfinedCursor(Cursor.鼠标形状定义)) 鼠标形状定义见(书 P 210)

④. 键盘事件

键盘事件源使用 addKeyListener 方法获得监视器

键盘事件的接口是 KeyListener 接口中有 3 个方法

  • public void keyPressed(KeyEvent e) 按下键盘按键
  • public void keyReleased(KeyEvent e) 释放键盘按键
  • public void keyTypde(KeyEvent e) 按下又释放键盘按键

21. 判断字符是否属于中文

public class IsChineseOrEnglish {
    / GENERAL_PUNCTUATION 判断中文的“号
    / CJK_SYMBOLS_AND_PUNCTUATION 判断中文的。号
    / HALFWIDTH_AND_FULLWIDTH_FORMS 判断中文的,号 public static Boolean isChinese(char c) {
        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
        if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
        | ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
        | ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
        | ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
        | ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
        | ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS){
            return true;
        }
        return false;
    }
    public static void isChinese(String strName) {
        char[] ch = strName.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            char c = ch[i];
            if(isChinese(c)==true){
                System.out.println(isChinese(c));
                return;
            } else{
                System.out.println(isChinese(c));
                return ;
            }
        }
    }
    public static void main(String[] args){
        isChinese("zhongguo");
        isChinese("中国");
    }
}

22. 去掉字符串中重复的子字符串

/**
* 去掉字符串中重复的子字符串
* @param str
* @return String
*/
private static String removeSameString(String str)
{
    Set<String> mLinkedSet = new LinkedHashSet<String>();
    String[] strArray = str.split(" ");
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < strArray.length; i++)
    {
        if (!mLinkedSet.contains(strArray[i]))
        {
            mLinkedSet.add(strArray[i]);
            sb.append(strArray[i] + " ");
        }
    }
    System.out.println(mLinkedSet);
    return sb.toString().substring(0, sb.toString().length() - 1);
}

23. 将指定 byte 数组以 16 进制的形式打印到控制台

/**
* 将指定 byte 数组以 16 进制的形式打印到控制台
* @param hint   String
* @param b  byte[]
* @return void
*/
public static void printHexString(String hint, byte[] b)
{
    System.out.print(hint);
    for (int i = 0; i < b.length; i++)
    {
        String hex = Integer.toHexString(b[i] & 0xFF);
        if (hex.length() == 1)
        {
            hex = '0' + hex;
        }
        System.out.print(hex.toUpperCase() + " ");
    }
    System.out.println("");
}

24. 获得任意一个整数的阶乘,递归

/**
* 获得任意一个整数的阶乘,递归
* @param n
* @return n!
*/
public static int factorial(int n)
{
    if (n == 1)
    {
        return 1;
    }
    return n * factorial(n - 1);
}

25. 拷贝一个目录或者文件到指定路径下

/**
* 拷贝一个目录或者文件到指定路径下
* @param source
* @param target
*/
public static void copy(File source, File target)
{
    File tarpath = new File(target, source.getName());
    if (source.isDirectory())
    {
        tarpath.mkdir();
        File[] dir = source.listFiles();
        for (int i = 0; i < dir.length; i++) {
            copy(dir[i], tarpath);
        }
    } else
    {
        try
        {
            InputStream is = new FileInputStream(source);
            OutputStream os = new FileOutputStream(tarpath);
            byte[] buf = new byte[1024];
            int len = 0;
            while ((len = is.read(buf)) != -1)
            {
                os.write(buf, 0, len);
            }
            is.close();
            os.close();
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

26. 简单的 txt 转换 xml

package cn.wuliaokankan;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.StringTokenizer;
public class TxtToXml {
    private String strTxtFileName;
    private String strXmlFileName;
    public TxtToXml() {
        strTxtFileName = new String();
        strXmlFileName = new String();
    }
    public void createXml(String strTxt, String strXml) {
        strTxtFileName = strTxt;
        strXmlFileName = strXml;
        String strTmp;
        try {
            BufferedReader inTxt = new BufferedReader(new FileReader( strTxtFileName));
            BufferedWriter outXml = new BufferedWriter(new FileWriter(
            strXmlFileName));
            outXml.write("<?xml version= "1.0" encoding="gb2312"?>");
            outXml.newLine();
            outXml.write("<people>");
            while ((strTmp = inTxt.readLine()) != null) {
                StringTokenizer strToken = new StringTokenizer(strTmp, ",");
                String arrTmp[];
                arrTmp = new String[3];
                for (int i = 0; i < 3; i++)
                arrTmp[i] = new String("");
                int index = 0;
                outXml.newLine();
                outXml.write(" <students>");
                while (strToken.hasMoreElements()) {
                    strTmp = (String) strToken.nextElement();
                    strTmp = strTmp.trim();
                    arrTmp[index++] = strTmp;
                }
                outXml.newLine();
                outXml.write("
<name>" + arrTmp[0] + "</name>");
                outXml.newLine();
                outXml.write("
<sex>" + arrTmp[1] + "</sex>");
                outXml.newLine();
                outXml.write("
<age>" + arrTmp[2] + "</age>");
                outXml.newLine();
                outXml.write("
</students>");
            }
            outXml.newLine();
            outXml.write("</people>");
            outXml.flush();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        String txtName = "testtxt.txt";
        String xmlName = "testxml.xml";
        TxtToXml thisClass = new TxtToXml();
        thisClass.createXml(txtName, xmlName);
    }
}

27. 字母排序(A-Z)(先大写,后小写)

import java.util.Arrays;
import java.util.Comparator;
public class SortTest
{
    public static void main(String args[])
    {
        char[] chs = {'f', 'F', 'K', 'A', 'a', 'j', 'z'};
        chs = sortChars(chs, false);
        for (char c: chs)
        {
            System.out.println(c);
        }
    }
    /**
* 对给定的字符数组进行字典排序
* @param chs 目标字符数组
* @param upperFisrt 大写字母是否在前
* @return 排序后的字符数组
*/
    public static char[] sortChars(char[] chs, final Boolean upperFisrt)
    {
        Character[] srcArray = new Character[chs.length];
        char[] retArray = new char[chs.length];
        int index = 0;
        for (char ch: chs)
        {
            srcArray[index++] = ch;
        }
        Arrays.sort(srcArray, new Comparator<Character>()
        {
            public int compare(Character c1, Character c2)
            {
                char ch1 = Character.toUpperCase(c1);
                char ch2 = Character.toUpperCase(c2);
                if(ch1 == ch2)
                {
                    int tempRet = c1.charValue() - c2.charValue();
                    return upperFisrt? tempRet: -tempRet;
                } else
                {
                    return ch1 - ch2;
                }
            }
        }
        );
        index = 0;
        for (char ch: srcArray)
        {
            retArray[index++] = ch;
        }
        return retArray;
    }
}

28. 列出某文件夹及其子文件夹下面的文件,并可根据扩展名过滤

/**
* 列出某文件夹及其子文件夹下面的文件,并可根据扩展名过滤
* @param path
*/
public static void list(File path)
{
    if (!path.exists())
    {
        System.out.println("文件名称不存在!");
    } else
    {
        if (path.isFile())
        {
            if (path.getName().toLowerCase().endsWith(".pdf")
            | path.getName().toLowerCase().endsWith(".doc")
            | path.getName().toLowerCase().endsWith(".html")
            | path.getName().toLowerCase().endsWith(".htm"))
            {
                System.out.println(path);
                System.out.println(path.getName());
            }
        } else
        {
            File[] files = path.listFiles();
            for (int i = 0; i < files.length; i++)
            {
                list(files[i]);
            }
        }
    }
}

29. 字符串匹配的算法

public String getMaxMatch(String a,String b) {
    StringBuffer tmp = new StringBuffer();
    String maxString = "";
    int max = 0;
    int len = 0;
    char[] aArray = a.toCharArray();
    char[] bArray = b.toCharArray();
    int posA = 0;
    int posB = 0;
    while(posA<aArray.length-max) {
        posB = 0;
        while(posB<(bArray.length-max)) {
            if(aArray[posA]==bArray[posB]) {
                len = 1;
                tmp = new StringBuffer();
                tmp.append(aArray[posA]);
                while((posA+len<aArray.length)&&(posB+len<bArray.length)&&(aArray[posA+len]==bArray[posB+len]))
                                      {
                    tmp.append(aArray[posA+len]);
                    len++;
                }
                if(len>max) {
                    max = len;
                    maxString = tmp.toString();
                }
            }
            posB++;
        }
        posA++;
    }
    return maxString;
}

写在最后

如果文章因为排版影响到大家的阅读的话,这份面试题我已经整理成一份PDF文件了,需要的朋友请点击下方传送门免费领取!

传送门

版权说明 : 本文为转载文章, 版权为原作者所有

原文标题 : 为了进字节跳动,我精选了29道Java经典算法题,带详细讲解

原文连接 : https://www.jianshu.com/p/034e7342c842