java leetcode

9.回文数

package java题库.LeetCode;

public class 回文数{
    
    
    public static void main(String[] args){
    
    
     进阶解法___数学解法(102201);
    }



    //这种方法里面没有多少是自己的东西
    public static boolean 暴力方法(int x){
    
    
        //这个就是将数字转化成字符串直接进行对比

        //创建字符串对象
            //这段代码整体的意思是:先创建StringBuilder对象,将其反转后转化为String对象
        String s=(new StringBuilder(x+"")).reverse().toString();
        if(s.equals(x+"")){
    
    
            //相等返回true
            return true;
        }
        return false;
    }



    public static boolean 进阶解法___数学解法(int x){
    
    
        //这种方法是依靠数学来解决问题
        //随意取一个数字123561
        //每次拿出''首位''和''末尾''进行比较
        //再将去掉首位和末尾的数字拿出来

        //首先负数不可能为回文数所以直接先将其排除在外
        if(x<0) return false;

        //找到合适的取整数
        int div=1;
        while(x/div>=10) div*=10;//这里是为了找到合适的可以把''首位''拿出来的div
        while(x>0){
    
    
            int left=x/div;
            int right=x%10;
            if(left!=right) return false;//只要有一次不相等就为false
            x=(x%div)/10;
            div/=100;

            //1000021像这种的00002会被看作2,这时候div还是10000所以left和right不会相等的
            //即''首位''为0会导致div比x多出1位这时候left一定为0,看''尾部''right是否为0就行了
        }
        //当循环结束还是好好的
        return true;

    }

    public static boolean 进阶解法___巧妙解法(int x){
    
    
        //这个的话就是将这个数字反转取一半来比较
        //负数不可能为回文数,因为输入的数字''头部''不可能为0所以''尾部''为0一定不是回文数
        if(x<0 || (x!=0 && x%10==0)) return false;
        int reverse=0;
        while(reverse<x){
    
    //只要比x小就说明还可以继续往后取
            reverse=reverse*10+x%10;
            x/=10;
        }
        //当结束循环时只能是reverse>=x
        //即reverse和x处于相同位数(或reverse比x大1位)
        return reverse==x || x==reverse/10;
    }
}

罗马数字转整数

package java题库.LeetCode;

import java.util.Dictionary;
import java.util.HashMap;
import java.util.Map;

public class 罗马数字转整数{
    
    
    public static void main(String[] args){
    
    
        计算("ddd");
    }
    public static long 计算(String s){
    
    
        int len=s.length();
        int sum_=0;
        for(int i=0;i<len;i++){
    
    
            int value=dic(s.charAt(i));
            if(i<len-1 && value<dic(s.charAt(i+1))) sum_-=value;
            else sum_+=value;
        }
        return sum_;
    }
    public static int dic(char s){
    
    
        switch(s){
    
    
            case 'I':return 1;
            case 'V':return 5;
            case 'X':return 10;
            case 'L':return 50;
            case 'C':return 100;
            case 'D':return 500;
            case 'M':return 1000;
            default: return 0;
        }

    }



    public static int 字典方式(String s){
    
    
        Map<Character, Integer> dic=new HashMap<Character, Integer>(){
    
    {
    
    
            put('I',1);
            put('V',1);
            put('X',1);
            put('L',1);
            put('C',1);
            put('D',1);
            put('M',1);
        }};
        int len=s.length();
        int sum_=0;
        for(int i=0;i<len;i++){
    
    
            int value=dic.get(s.charAt(i));
            if(i<len-1 && value<dic.get(s.charAt(i+1))) sum_-=value;
            else sum_+=value;
        }
        return sum_;
    }

}

14. 最长公共前缀

package java题库.LeetCode;

public class 最长公共前缀{
    
    
    public static void main(String[] args){
    
    
        横向扫描(new String[]{
    
    "dog","racecar","car"});
    }


    public static String 横向扫描(String[] strs){
    
    
        //这种写法是先拿两个字符串进行比较
        //获得他们的公共前缀(这样在字符串数组中所有字符串公共前缀长度一定是小于等于的)
        //再将公共前缀和其他字符串进行比较

        if(strs.length==1) return strs[0];//如果只有一个直接输出

        String first=strs[0];
        String second=strs[1];

        //进行比较
        int i=0;
        String str="";
        while(i<first.length() && i<second.length()){
    
    
            if(first.charAt(i)==second.charAt(i)){
    
    //相等的保存下来
                str+=first.charAt(i);
            }else{
    
    
                break;
            }
            i+=1;
        }

        //开始和字符串数组中的其他元素进行比较
        for(int j=2;j<strs.length;j++){
    
    
            String current=strs[j];
            i=0;
            String panduan="";
            while(i<str.length() && i<current.length()){
    
    
                if(str.charAt(i)==current.charAt(i)){
    
    
                    panduan+=str.charAt(i);
                }else{
    
    
                    if(panduan.equals("")) return "";
                    break;
                }
                i+=1;
            }
            str=panduan;
        }
        return str;
    }


    public static String 纵向扫描(String[] strs){
    
    
        //这种写法就像当于把所有的字符串堆在一起:
                //字符串1
                //字符串2
                //字符串3
                //......
                //字符串n
        //然后从第一位开始比较


        String first=strs[0];
        for(int i=0;i<first.length();i++){
    
    //最多可以比对的次数就是first的长度
            for(int j=1;j<strs.length;j++){
    
    //每次对应位置需要比对的元素个数
                String item=strs[j];
                if(i<item.length()){
    
    
                    if(first.charAt(i)!=item.charAt(i)){
    
    
                        return first.substring(0,i);//字符串切分
                    }
                }
                else{
    
    
                    //i只有等于item.length()才会进来
                    //这时候可以知道字符串的最小长度为(0--i-1)
                    return first.substring(0,i);
                }
            }
        }
        //如果第一个for循环没有进去说明first为""
        //如果进去了但是没有执行return语句,那么就是说
        //当前的first一定是字符串数组里面所有字符串的子串
        //所以first就是最大的公共前缀
        return first;
    }


}

class digui {
    
    
    public static String 递归(String[] strs) {
    
    
        //递归写法的核心就是
        //1.基本结束条件
        //2.不断向基本结束条件演进
        //3.可以划分成更小的自己执行运算
        int right = strs.length;
        if(right == 0) return "";
        if(right==1)return strs[0];

        return hexing(strs,0,right-1);

    }

    public static String hexing(String[] strs,int left,int right){
    
    
        if(left==right) return strs[left];
        int mid=(left+right)/2;
        String leftStr=hexing(strs,left,mid);
        String rightStr=hexing(strs,mid+1,right);

        int i=0;
        while(i<leftStr.length() && i<rightStr.length()){
    
    
            //开始纵向的比对
            if(leftStr.charAt(i)!=rightStr.charAt(i)){
    
    
                return leftStr.substring(0,i);
            }
            i+=1;
        }
        if(leftStr.length()<rightStr.length()){
    
    
            return leftStr;
        }
        return rightStr;
    }
}

おすすめ

転載: blog.csdn.net/qq_53183608/article/details/119655947