Two Pointers Day
(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的更多相关文章
- 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 ...
- Leetcode 笔记 116 - Populating Next Right Pointers in Each Node
题目链接:Populating Next Right Pointers in Each Node | LeetCode OJ Given a binary tree struct TreeLinkNo ...
- [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 ...
- [LeetCode] Populating Next Right Pointers in Each Node 每个节点的右向指针
Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...
- [c++] Smart Pointers
内存管理方面的知识 基础实例: #include <iostream> #include <stack> #include <memory> using names ...
- LEETCODE —— Populating Next Right Pointers in Each Node
Populating Next Right Pointers in Each Node Given a binary tree struct TreeLinkNode { TreeLinkNode * ...
- LeetCode OJ 116. Populating Next Right Pointers in Each Node
Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...
- 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, ...
- LeetCode - Populating Next Right Pointers in Each Node II
题目: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given ...
- LeetCode - Populating Next Right Pointers in Each Node
题目: Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode ...
随机推荐
- CGI
CGI的工作原理一般是这么定义的: 客户端web浏览器浏览某个主页后,利用一定的方式提交数据,并通过HTTP协议向Web服务器发出请求,服务器端的HTTP Daemon(守护进程)将描述的主页信息通过 ...
- js声明json数据,打印json数据,遍历json数据
1.js声明json数据: 2.打印json数据: 3.遍历json数据 //声明JSON var json = {}; json.a = 1; //第一种赋值方式(仿对象型) json['b'] = ...
- 64位系统上运行32位程序能否申请到8G内存?
申请不到,因为64为系统在运行32位程序的时候只是为了向下兼容而已,对于32位程序来讲,申请8G的存储空间没有任何意义,因为32位的程序最大寻址空间只有4G,32位程序在编译之后的机器代码也只有32位 ...
- 彻底搞定char/wchar_t/unicode
彻底搞定char/wchar_t!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (2013-07-17 10:18:28) 转载▼ 从char/wchar_t到TCHAR(1) ...
- mir [20161220]
最近玩backmir,查询了一些资料,突然领悟到原来各个地方的boss攻击和防御都有一定的上限,而相对应的,玩家也有攻击和防御,只要玩家的攻防能对付boss的攻防,就可以无伤打boss. 小时候玩热血 ...
- XE7 & IOS开发之开发账号(2):发布证书、发布授权profile的申请使用,附Ad hoc真机调试、生成ipa文件演示(XCode所有版本通用,有图有真相)
网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 注意,以下讨论都是以&q ...
- ipad2 恢复
1.用原装充电线连接电脑,并打开itunes~2.同时按住电源键和home键 10秒左右,直到白苹果画面变成黑屏3.按住home键~但要松开电源键,继续等待~直到ipad出现画面(如图) 4.这时候, ...
- ubuntu下git安装及使用
ubuntu下git安装及使用 其实,好几个月前,就已经安装好了,可是一直搁置在那儿,所以密码等一些其它细节都忘的差不多了,所以今天就重新部署了一下,并开始积极使用......... 1,git ...
- URL中文转码问题
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- js判断是否是移动设备登陆网页
var browser = { versions: function () { var u = navigator.userAgent, app = ...