题目:实现StrStr() 执行用时: 4 ms,
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle
字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:
输入: haystack = "aaaaa", needle = "bba"
输出: -1
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
public int strStr(String haystack, String needle) {
int h_length=haystack.length();
int n_length = needle.length();
if( h_length==0 && n_length!=0) return -1;
if(h_length==0 && n_length==0) return 0;
char[] h = haystack.toCharArray();
char[] n = needle.toCharArray();
String s2 = new String(n);
for(int i=0;i<h_length-n_length+1;i++){
//如果这里不加1的话 "a" "a" 这种就通过不了
String s1 = new String(h,i,n_length);
//从h 字符数组中获取从i开始长度为n_length 的字符
if(s1.equals(s2)) return i;
}
return -1;
}
注释:
indexOf() 方法有以下四种形式:
public int indexOf(int ch):
返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
public int indexOf(int ch, int fromIndex):
返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
int indexOf(String str):
返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
int indexOf(String str, int fromIndex):
返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
题目:移除元素 https://leetcode-cn.com/problems/remove-element/solution/
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
注意这五个元素可为任意顺序。
你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
注意啦:原定位置移数,题目理解错误做法还没提交成功
public int removeElement(int[] nums, int val) {
//先排序 然后把值提到后面去 然后倒转-数
Arrays.sort(nums);
int temp,j=nums.length-1,len =nums.length ;
while(nums[j] == val) j--;
for(int i=0;i<nums.length;i++){
if(nums[i] == val) {
temp = nums[i];
nums[i] = nums[j];
nums[j--] = temp;
}
}
for(int i=0;i<nums.length;i++){
if(nums[i] == val) len--;
}
return len;
}
法一:双指针 5ms 与删除排序数组中的重复项方法一样
https://leetcode-cn.com/articles/remove-duplicates-from-sorted-array/
public int removeElement(int[] nums, int val) {
int i= 0;
for(int j=0;j<nums.length;j++){
if(nums[j] != val){
nums[i] = nums[j];
i++;
}
}
return i;
}
法二: 6 ms
当我们遇到 nums[i] = valnums[i]=val 时,我们可以将当前元素与最后一个元素进行交换,
并释放最后一个元素。这实际上使数组的大小减少了 1。
请注意,被交换的最后一个元素可能是您想要移除的值。但是不要担心,在下一次迭代中,
我们仍然会检查这个元素。
public int removeElement(int[] nums, int val) {
int i= 0;
int n = nums.length;
while(i<n){
if(nums[i] == val) {
nums[i] = nums[n-1];
//自己的误区:将值交换,其实不需要,直接把val值舍弃,但是有个问题,如果n-1的值也等于val呢
//解答 可以试着带一组数据进去,会发现 最后nums[n-1] 仍旧进入if判断重复操作
n--;
}else i++;
}
return n;
}
题目:最大子序和(经典题)
https://leetcode-cn.com/problems/maximum-subarray/
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
法一:
public int maxSubArray(int[] nums) {
int[] maxValue = new int[nums.length];
int res = nums[0];
maxValue[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
maxValue[i] = ((maxValue[i-1] + nums[i]) > nums[i] ? (maxValue[i-1] + nums[i]):nums[i]);
if (maxValue[i] > res){
res = maxValue[i];
}
}
//System.out.print(res);
return res;
法二:
思路:循环,拿到每个数,拿的时候做累加,如果出现小于0的,把累加和重新赋值0,再次累加
public int maxSubArray(int[] nums) {
int res = nums[0];
int sum = 0;
for (int num : nums) {
if (sum > 0)
sum += num;
else
sum = num;
res = Math.max(res, sum);
}
return res;
}
注解: for(元素类型t 元素变量x : 遍历对象obj){
引用了x的java语句;
}
这是一个foreach循环遍历....
就是把nums这个数组进行遍历,它有多少个数,就遍历多少遍。
遍历的时候每次就把其中的一个值给num;
for(int i =0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
给这个for循环一样....
题目:最后一个单词的长度
https://leetcode-cn.com/problems/length-of-last-word/
给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指由字母组成,但不包含任何空格的字符串。
示例:
输入: "Hello World"
输出: 5
代码:
//思路: 从后面开始找,碰到空格就停止
public int lengthOfLastWord(String s) {
int i=0,len = s.length(),count=0;
char [] chars = s.toCharArray();
for(i=len-1;i>=0;i--){ //最后一个
if(chars[i] == ' ') break;
count++;
}
return count;
}
public int lengthOfLastWord(String s) {
int i=0,len = s.length(),count=0;
for(i=len-1;i>=0;i--){ //最后一个
if(s.charAt(i) == ' ')
break;
count++;
}
return count;
}
//思路: 将字符串变成字符串数组然后求最后一个的length
public int lengthOfLastWord(String s) {
String arr[] = s.split(' '); //incompatible types: char cannot be converted to String
int len = arr.length;
int count = arr[len-1].length();
return count;
}
3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb" 输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb" 输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew" 输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
时间:2018.12.10