3,Longest Substring Without Repeating Characters
题目:Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
分析:
给定一个字符串,比较连续不重复的字串,返回最长字串的长度。
方法一:将字符串遍历,从第一个字符开始,然后从第二个字符开始........找到每一个不重复字串,放到一个stringBuffer数组里(StringBuffer比String快,本题使用Sring会超时,StringBuffer刚好不超时),然后定义一个同样长的int 数组,用来记录String Buffer数组的每一个字符串的长度,返回int数组中最长的一个数即可。
方法二:用hash map效率会好很多。
代码一:
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null ||s.length()<=1) return s.length();
StringBuffer [] arr = new StringBuffer[s.length()];//声明10个 StringBuffer 的变量 并没有创建对象
int [] result = new int [s.length()];
Arrays.fill(result,0);
for(int i = 0;i < s.length();i++){
arr[i] = new StringBuffer(); //这是给变量创建对象
arr[i].append(s.charAt(i));
for(int j = i+1;j < s.length();j++){
if((arr[i].indexOf(String.valueOf(s.charAt(j)))) ==-1){//StringBuffer类中的indexOf()中只能是查找字符串是否存在,不是字符 String类中用法一样
arr[i].append(s.charAt(j));
}else
break;
}
result[i] = arr[i].length();
}
Arrays.sort(result);
return result[s.length()-1];
}
}
代码二:
import java.util.*;
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() <=1) return s.length();
Map <Character, Integer> map = new HashMap <Character, Integer>();
int max = 0,start = 0;
for(int i = 0;i<s.length();i++){
if(map.containsKey(s.charAt(i))){
start = Math.max(start,map.get(s.charAt(i))+1);
}
max = Math.max(max,i-start+1);
map.put(s.charAt(i),i);
}
return max;
}
}
53. Maximum Subarray
题目:
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4]
,
the contiguous subarray [4,-1,2,1]
has the largest sum = 6
.
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
分析:给一个数组,求其和最大的连续的子数组,返回最大和的值。
代码:
class Solution {
public int maxSubArray(int[] nums) {
int max= Integer.MIN_VALUE,sum = 0;
for(int i =0;i<nums.length;i++){
if(sum<0) sum = nums[i];
else sum += nums[i];
max = Math.max(max,sum);
}
return max;
}
}
知识点:
StringBuffer [] arr = new StringBuffer[s.length()];//声明10个 StringBuffer 的变量 并没有创建对象
for(int i = 0;i < s.length();i++){
arr[i] = new StringBuffer(); //这是给变量创建对象
}
StringBuffer类中的indexOf()中只能是查找字符串是否存在,不是字符 String类中用法一样
String.valueOf()方法的使用
1. 由基本数据型态转换成 String
String 类别中已经提供了将基本数据型态转换成 String 的 static 方法
也就是 String.valueOf() 这个参数多载的方法
有下列几种
String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串
String.valueOf(char c) : 将 char 变量 c 转换成字符串
String.valueOf(char[] data) : 将 char 数组 data 转换成字符串
String.valueOf(char[] data, int offset, int count) :
将 char 数组 data 中 由 data[offset] 开始取 count 个元素 转换成字符串
String.valueOf(double d) : 将 double 变量 d 转换成字符串
String.valueOf(float f) : 将 float 变量 f 转换成字符串
String.valueOf(int i) : 将 int 变量 i 转换成字符串
String.valueOf(long l) : 将 long 变量 l 转换成字符串
String.valueOf(Object obj) : 将 obj 对象转换成 字符串, 等于 obj.toString()
用法如:
int i = 10;
String str = String.valueOf(i);
这时候 str 就会是 "10"
2. 由 String 转换成数字的基本数据型态
要将 String 转换成基本数据型态转
大多需要使用基本数据型态的包装类别
比如说 String 转换成 byte
可以使用 Byte.parseByte(String s)
这一类的方法如果无法将 s 分析 则会丢出 NumberFormatException
byte :
Byte.parseByte(String s) : 将 s 转换成 byte
Byte.parseByte(String s, int radix) : 以 radix 为基底将s转换为 byte
比如说 Byte.parseByte("11", 16) 会得到 17
double :
Double.parseDouble(String s) : 将 s 转换成 double
float :
Double.parseFloat(String s) : 将 s 转换成 float
int :
Integer.parseInt(String s) : 将 s 转换成 int
long :
Long.parseLong(String s):将 s 转换成 Long