(1)Reverse String

解题思路简单明了,但是要注意时间复杂度问题!!!

代码如下:(声明一个与字符串等长的char数组,然后倒序区字符串中的字符,放入数组即可。)

 public class Solution {
public String reverseString(String s) {
char[] chars = new char[s.length()];
int index = 0;
for (int i = s.length() - 1; i >= 0; i--) {
chars[index++] = s.charAt(i);
}
return new String(chars);
}
}

(2) Reverse Vowels of a String

解题思路一:

使用start和end两个指针,依次找到最前端和最后端的两个元音字母互换位置,然后start++,end-- ,直至start不小于end结束即可。

代码如下:

 public class Solution {
public String reverseVowels(String s) {
if(s == null || s.length()==0) return s;
String vowels = "aeiouAEIOU";
char[] chars = s.toCharArray();
int start = 0;
int end = s.length()-1;
while(start<end){
//while(start<end && !vowels.contains(chars[start]+""))
while(start<end && vowels.indexOf(chars[start]) == -1){
start++;
}
//while(start<end && !vowels.contains(chars[end]+""))
while(start<end && vowels.indexOf(chars[end]) == -1){
end--;
} char temp = chars[start];
chars[start] = chars[end];
chars[end] = temp; start++;
end--;
}
return new String(chars);
}
}

解题思路二:

使用hashset,首先找到所有元音字母所在的位置并记录,然后依然是最前最后的元素进行互换。

代码如下:

public class Solution {
public String reverseVowels(String s) {
int[] pos = new int[s.length()];
int cnt = 0;
HashSet<Character> vowel = new HashSet<Character>();
vowel.add('a');
vowel.add('e');
vowel.add('i');
vowel.add('o');
vowel.add('u');
vowel.add('A');
vowel.add('E');
vowel.add('I');
vowel.add('O');
vowel.add('U'); for (int i = 0; i < s.length(); i++) {
if (vowel.contains(s.charAt(i))) {
pos[cnt] = i;
cnt++;
}
} char[] ans = new char[s.length()];
ans = s.toCharArray();
for (int i = 0; i < cnt; i++) {
ans[pos[i]] = s.charAt(pos[cnt - i - 1]);
}
return String.valueOf(ans);
}
}

(3)Valid Palindrome

解题思路:利用s.replaceAll(字符串要匹配的正则式,替换字符串)来使字符串只含有字母和数字,然后前后依次比较即可。

代码如下:

 public class Solution {
public boolean isPalindrome(String s) {
String regex = "([^A-Za-z0-9])";
String replacement = "";
s = s.replaceAll(regex, replacement);//将不是字母和数字的替换掉
for (int i = 0; i < s.length() / 2; i++) {
if (Character.toLowerCase(s.charAt(i)) == Character.toLowerCase(s.charAt(s.length()-1-i)))
continue;
else
return false;
}
return true;
}
}

(4)Implement strStr()

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

解题思路一:

在Java中,有一个API函数名indexof(),

它返回指定子字符串第一次出现在此字符串中的索引。

代码如下:

 public class Solution {
public int strStr(String haystack, String needle) {
int i;
i = haystack.indexOf(needle);
return i;
}
}

解题思路二:不使用indexof()函数。

从haystack的第一个位置,开始逐个判断是不是子串。如果整个子串都匹配了,那么就返回,否则继续往下挪位置。

注意要看haystack剩余的长度跟needle比是不是足够多,不够的话也就不用往后比了。

代码如下:

 public class Solution {
public int strStr(String haystack, String needle) {
for (int i = 0; ; i++) {
for (int j = 0; ; j++) {
if (j == needle.length()) {
return i;//返回子字符串第一次出现的位置
}
if (i + j == haystack.length()) {
return -1;
}
if (needle.charAt(j) != haystack.charAt(i + j)) {
break;//跳出内部for循环
}
}
}
}
}

Two Pointers Day的更多相关文章

  1. Leetcode 笔记 117 - Populating Next Right Pointers in Each Node II

    题目链接:Populating Next Right Pointers in Each Node II | LeetCode OJ Follow up for problem "Popula ...

  2. Leetcode 笔记 116 - Populating Next Right Pointers in Each Node

    题目链接:Populating Next Right Pointers in Each Node | LeetCode OJ Given a binary tree struct TreeLinkNo ...

  3. [LeetCode] Populating Next Right Pointers in Each Node II 每个节点的右向指针之二

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  4. [LeetCode] Populating Next Right Pointers in Each Node 每个节点的右向指针

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  5. [c++] Smart Pointers

    内存管理方面的知识 基础实例: #include <iostream> #include <stack> #include <memory> using names ...

  6. LEETCODE —— Populating Next Right Pointers in Each Node

    Populating Next Right Pointers in Each Node Given a binary tree struct TreeLinkNode { TreeLinkNode * ...

  7. LeetCode OJ 116. Populating Next Right Pointers in Each Node

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  8. Pointers and Dynamic Allocation of Memory

    METHOD 1: Consider the case where we do not know the number of elements in each row at compile time, ...

  9. LeetCode - Populating Next Right Pointers in Each Node II

    题目: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given ...

  10. LeetCode - Populating Next Right Pointers in Each Node

    题目: Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode ...

随机推荐

  1. 源码阅读笔记 - 2 std::vector (1)

    vector的源码真是太长了,今天用了一个下午和一个晚上看和注释了前面的一千行左右 p.s.博客园的代码高亮真是太垃圾, 如果想要阅读带注释的源码,推荐粘贴到VS2015里,然后按ctrl+z取消自动 ...

  2. Bugtags奉命解救宝贵的双手,务必将此文章转给你身边的程序猿

    移动应用 Bug 快速反馈神器 前段时间,有很多 APP 突然走红,最终却都是樱花一现.作为一个创业团队,突然爆红是非常难得的机会.但是很可惜,由于没有经过充分的测试,再加上用户的激增,APP 闪退. ...

  3. Android 对话框(Dialog)大全 建立你自己的对话框

    Android 对话框(Dialog)大全 建立你自己的对话框 原文地址: http://www.cnblogs.com/salam/archive/2010/11/15/1877512.html A ...

  4. win10 chrome浏览器字体小,模糊

    解决方案: chrome://flags/

  5. C语言实现GPT头和分区表的读取(gcc)

    #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h&g ...

  6. 解决MD5问题

    使用VS时报错此实现不是 Windows 平台 FIPS 验证的加密算法的一部分. 解决方案如下:在window中打开功能里输入regedit,回车打开注册器.然后进入如下路径中 HKEY_LOCAL ...

  7. Android IOS WebRTC 音视频开发总结(七七)-- WebRTC的架构和协议栈

    本文主要介绍WebRTC的架构和协议栈(我们翻译和整理的,译者:litie),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam ...

  8. jQuery学习笔记(在js中增加、删除及定位控件的操作)

    代码内容很多都是从amazeui直接copy过来的,先声明,请不要说在下抄袭- - <!-------------------- HTML代码 ----------------------> ...

  9. redis常用总结

    1. 使用redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,li ...

  10. 过渡transitioin

    一,什么是过渡(transition)? 1,transition 允许 CSS 元素的属性值在一定的时间区间内平滑地过渡. 2,可以在不使用 Flash 动画或 JavaScript 的情况下,在元 ...