算法练习(二)
算法练习(二)
找到字符串的最长无重复子串
题目描述
给定一个数组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;
}
}