4月30日算法刷题

import javax.xml.stream.events.Characters;
import java.util.*;

public class test_04_27 {

    //KMP算法

    //替换空格
    public static void test1(String s){
        StringBuilder stringBuilder = new StringBuilder();
        for (int i=0;i<s.length();i++){
            if (s.charAt(i)!=' '){
                stringBuilder.append(s.charAt(i));
            }else{
                stringBuilder.append("%20");
            }
        }
        System.out.println(stringBuilder.toString());
    }
    //最长公共前缀
    public static void test2(String[] strs){
        int min = strs[0].length();
        for (int i=1;i<strs.length;i++){
            min = Math.min(min, strs[i].length());
        }
        String res = "";
        for (int i=0;i<min;i++){
            boolean flag = true;
            for (int j=0;j<strs.length-1;j++){
                if (strs[j].charAt(i)!=strs[j+1].charAt(i)){
                    flag = false;
                    break;
                }
            }
            if (flag){
                res += strs[0].charAt(i);
            }else{
                break;
            }
        }
        System.out.println(res);
    }

    //最长回文串
    public static void test3(String s){
        TreeMap<Character, Integer> hashMap = new TreeMap<>();
        for (int i=0;i<s.length();i++){
            hashMap.put(s.charAt(i),hashMap.getOrDefault(s.charAt(i),0)+1);
        }
        Collection<Integer> values = hashMap.values();
        Integer[] integers = values.toArray(new Integer[values.size()]);

        int res = 0;
        int x = -1;
        for (int i=0;i<values.size();i++){
            res += integers[i]/2*2;
            if ((integers[i]&1)==1&&integers[i]>x){
                x=integers[i];
            }
        }
        if (x!=-1){
            res += x;
        }

        System.out.println(res);
    }

    //验证回文串
    public static boolean test4(String s){
        int i=0;
        int j=s.length()-1;
        while (i<j){
            while (i<j&&!Character.isLetter(s.charAt(i))&&!Character.isDigit(s.charAt(i))){
                i++;
            }
            while (i<j&&!Character.isLetter(s.charAt(j))&&!Character.isDigit(s.charAt(j))){
                j--;
            }
            if ((Character.isDigit(s.charAt(i))&&Character.isDigit(s.charAt(j))
                    &&(Character.isDigit(s.charAt(i))==Character.isDigit(s.charAt(j))))
                    || Character.toLowerCase(s.charAt(i))==Character.toLowerCase(s.charAt(j))){
                i++;
                j--;
            }else{
                return false;
            }
        }
        return true;
    }
    //找出最长回文子串 babad
    public static void test5(String s){
        int n = s.length();
        boolean[][] flag = new boolean[n][n];
        String res = "";
        for (int k=0;k<n;k++){
            int i=0;
            int j=i+k;
            while (j<n){
                if (k==0){
                    flag[i][j]=true;
                }else if (k==1){
                    flag[i][j]= s.charAt(i) == s.charAt(j);
                }else{
                    if (s.charAt(i)==s.charAt(j)){
                        flag[i][j]=flag[i+1][j-1];
                    }else{
                        flag[i][j]=false;
                    }
                }
                if (flag[i][j]&&j-i+1>res.length()){
                    res=s.substring(i,j+1);
                }
                i++;
                j++;
            }
        }
        System.out.println(res);
    }
    //最长回文子序列
    //   b a c a d b
    // b
    // a
    // c
    // b
    public static void test6(String s){
        int n = s.length();
        int[][] dp = new int[n][n];
        int res = 1;
        for (int k=0;k<n;k++){
            int i=0;
            int j=i+k;
            while (j<n){
                if (k==0){
                    dp[i][j]=1;
                }else if (k==1){
                    if (s.charAt(i)==s.charAt(j)){
                        dp[i][j]=2;
                    }else{
                        dp[i][j]=1;
                    }
                }else{
                    if (s.charAt(i)==s.charAt(j)){
                        dp[i][j]=dp[i+1][j-1]+2;
                    }else{
                        dp[i][j]=Math.max(dp[i+1][j],dp[i][j-1]);
                    }
                }
                res = Math.max(dp[i][j],res);
                i++;
                j++;
            }
        }
        System.out.println(res);
    }
    //字符串转为整数 "1233444322"
    public static void test7(String s){
        int k=1;
        int res = 0;
        //去除符号位
        int flag = 0;
        if (s.charAt(0)=='+'){
            flag=1;
        }else if (s.charAt(0)=='-'){
            flag=2;
        }
        int end = flag>0?1:0;
        for (int i=s.length()-1;i>=end;i--){
            if (!Character.isDigit(s.charAt(i))){
                System.out.println("不符合");
                return;
            }
            res += (s.charAt(i)-48)*k;
            k=k*10;
        }
        if (flag==2){
            System.out.println(-1*res);
        }else{
            System.out.println(res);
        }
    }
    //最长有效括号
    //)()())
    public static void test8(String s){
        int n = s.length();
        int[] dp = new int[n];
        for (int i=0;i<n;i++){
            if (s.charAt(i)=='('){
                dp[i]=0;
            }else{
                if (i==0){
                    continue;
                }
                if (s.charAt(i-1)==')'){
                    if (i-dp[i-1]-1>=0&&(s.charAt(i-dp[i-1]-1)=='(')){
                        if (i-dp[i-1]-2>=0){
                            dp[i]=dp[i-1]+2+dp[i-dp[i-1]-2];
                        }else{
                            dp[i]=dp[i-1]+2;
                        }
                    }
                }else{
                    if (i-2>=0){
                        dp[i]=dp[i-2]+2;
                    }
                }
            }
        }
        System.out.println(Arrays.toString(dp));
    }


    //给出一个合法的
    public static void test9(String s){
        int max=0;
        int count=0;
        for (int i=0;i<s.length();i++){
            if (s.charAt(i)=='('){
                count++;
            }else{
                count--;
            }
            max = Math.max(max,count);
        }
        System.out.println(max);
    }

    static class TreeNode{
        int data;
        TreeNode next;
        public TreeNode(int data){
            this.data = data;
        }
    }
    //两数相加
    public static TreeNode test10(TreeNode root1,TreeNode root2){
        int k=0;
        TreeNode pre=root1;
        TreeNode p=null;
        TreeNode q=root2;
        while (root1!=null&&root2!=null){
            int res = root1.data+root2.data +k;
            root1.data = res%10;
            k = res/10;
            p=root1;
            root1=root1.next;
            root2=root2.next;
        }
        if (p==null){
            return q;
        }
        while (root2!=null){
            int res = root2.data+k;
            k = res/10;
            p.next=new TreeNode(res%10);
            root2=root2.next;
        }
        return pre;
    }

    //翻转链表
    public static TreeNode test11(TreeNode root){
        TreeNode pre = null;
        TreeNode p = root;
        TreeNode pp = root.next;
        while (pp!=null){
            p.next=pre;
            pre=p;
            p=pp;
            pp=pp.next;
        }
        p.next=pre;
        return p;
    }

    public static TreeNode test12(TreeNode root){
        if (root.next==null){
            return root;
        }
        TreeNode newHead = test12(root.next);
        root.next.next=root;
        root.next=null;
        return newHead;
    }

    //链表中倒数第k个节点
    // 1 2 3 4 5
    public static void test13(TreeNode root,int k){
        TreeNode p = root;
        TreeNode q = root;
        while (q!=null&&k-->0){
            q=q.next;
        }
        //判断
        if (q==null&&k>0){
            System.out.println("找不到");
            return;
        }
        while (q!=null){
            p=p.next;
            q=q.next;
        }
        System.out.println(p.data);
    }

    //删除链表中倒数第k个节点
    public static TreeNode test14(TreeNode root,int k){
        TreeNode p = root;
        TreeNode q = root;
        while (q!=null&&k-->0){
            q=q.next;
        }
        //判断
        if (q==null&&k>0){
            System.out.println("找不到");
            return null;
        }
        TreeNode pre = null;
        while (q!=null){
            pre = p;
            p=p.next;
            q=q.next;
        }
        if (pre==null){
            root = root.next;

        }else{
            pre.next=p.next;
        }
        return root;
    }
    //合并两个排序的链表
    //1
    //2 3
    public static TreeNode test15(TreeNode root1, TreeNode root2){
        TreeNode dump = new TreeNode(-1);
        TreeNode p = dump;
        while (root1!=null&&root2!=null){
            if (root1.data<root2.data){
                p.next=root1;
                root1 = root1.next;
                p=p.next;
            }else{
                p.next=root2;
                root2 = root2.next;
                p=p.next;
            }
        }
        if (root1!=null){
            p.next=root1;
        }
        if (root2!=null){
            p.next=root2;
        }
        return dump.next;
    }

    //颜色分类
    public static void sortColors(int[] nums) {
        int left = 0;
        int right = nums.length-1;
        int mid=0;
        while (mid<=right){
            if (nums[mid]==0){
                int temp = nums[left];
                nums[left]=nums[mid];
                nums[mid] = temp;
                left++;
                mid++;
            }else if (nums[mid]==2){
                int temp = nums[right];
                nums[right]=nums[mid];
                nums[mid] = temp;
                right--;
            }else{
                mid++;
            }
        }
    }

    //1 1 1 2 2
    //在排序数组中查找元素第一个和最后一个
    public static int[] searchRange(int[] nums, int target) {
        int i=0;
        int[] res = new int[2];
        Arrays.fill(res,-1);
        while (i<nums.length){
            if (i>0&&nums[i]==nums[i-1]){
                if (nums[i]==target){
                    res[1]=i;
                }
                i++;
            }else{
                if (target==nums[i]){
                    res[0]=i;
                    res[1]=i;
                }
                i++;
            }
        }
        return res;
    }
    public static void main(String[] args) {
        int[] ints = searchRange(new int[]{5,7,7,7,8,8,10}, 7);
        System.out.println(Arrays.toString(ints));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值