算法练习(二)

算法练习(二)

找到字符串的最长无重复子串

题目描述

给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。

示例

输入

[2,3,4,5]

返回值

4

输入

[2,2,3,4,3]

返回值

3

题解

import java.util.*;
import java.math.*;
 
 
public class Solution {
 
    public int maxLength (int[] arr) {
 
        if(arr.length < 2)
            return arr.length;
        HashMap<Integer,Integer> map = new HashMap<>();
        int res = 1;
 
        for(int start=0, end=0; end < arr.length; end++){
        /*当某个数在之前出现过,这个时候就把子串的起点start往后推一个,但是有一种情况,
        比如1,2,3,4,3,5,1。到第二个3时,以后的子串起点start为4,
        到第二个1时,如果不取最大的start,按start = map.get(arr[end])+1
        算出起点start为2,显然以起点start=2,结尾end=1的子串234351有重复的,
        因此start要取最大的
            */
            if(map.containsKey(arr[end])){
                start = Math.max(start,map.get(arr[end])+1);
            }
            res = Math.max(res,end-start+1);
            map.put(arr[end],end);
        }
        return res;
    }
}

括号序列

题目描述

给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。

示例

输入

"["

返回值

false

输入

"[]"

返回值

true

题解

import java.util.*;

public class Solution {
    /**
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    public boolean isValid (String s) {
        // write code here
        Stack st = new Stack();
        char symbol;
        for(int i=0;i<s.length();i++){
            if(st.empty()){
                st.push(s.charAt(i));
                continue;
            }
            symbol= (char) st.peek();
            st.push(s.charAt(i));
            switch((char) st.peek()){
                case ')':
                    if(symbol=='('){
                        st.pop();
                        st.pop();
                        break;
                    }
                case ']':
                    if(symbol=='['){
                        st.pop();
                        st.pop();
                        break;
                    }
                case '}':
                    if(symbol=='{'){
                        st.pop();
                        st.pop();
                        break;
                    }
            }
        }
        if(st.empty())
            return true;
        return false;
    }
}

斐波那契数列

题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。

n≤39

示例

输入

4

返回值

3

题解

public class Solution {
    public int Fibonacci(int n) {
        int arr[] = new int[40];
        arr[0]=0;
        arr[1]=1;
        for(int i=2;i<arr.length;i++){
            arr[i]=arr[i-1]+arr[i-2];
        }
        return arr[n];
    }
}

二分查找

题目描述

请实现有重复数字的升序数组的二分查找

给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

示例

输入

[1,2,4,4,5],4

返回值

2

说明

从左到右,查找到第1个为4的,下标为2,返回2 

题解

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 如果目标值存在返回下标,否则返回 -1
     * @param nums int整型一维数组 
     * @param target int整型 
     * @return int整型
     */
    public int search (int[] nums, int target) {
        int low = 0;
        int high = nums.length-1;
        int mid = 0;
        while(low <= high){
            mid = low+ (high- low) / 2;
            if(nums[mid] == target){
                while(mid != 0 &&(nums[mid-1] == nums[mid])){
                    mid--;
                }
                return mid;
            }
            else if(nums[mid] > target){
                high = mid - 1;
            }
            else if(nums[mid] < target){
                low = mid + 1;
            }
        }
        return -1;
    }
}
posted @ 2021-04-10 13:27  1LDK  阅读(75)  评论(0编辑  收藏  举报