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 ...
随机推荐
- 关于Spring事务回滚的问题
在spring的配置文件中,如果数据源的defaultAutoCommit设置为True了,那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚,如下例比如配置文件里有这么 ...
- php 构造函数格式,具体该怎么写?应该注意什么呢?
在PHP里,如果你没有手写构造函数,则php在实例化这个对象的时候,会自动为类成员以及类方法进行初始化,分配内存等工作,但是有些时候不能满足我们的要求,比如我们要在对象实例化的时候传递参数,那么就需要 ...
- Kendo UI For ASP.NET MVC项目资源
一.官网: 1.Telerik大学官网:http://best.telerikacademy.com/ 二.相关博客 1.http://blog.csdn.net/magicsgxie/article ...
- Google Font字体本地化使用提高网站访问速度
Google Web font在国内经常不稳定,速度在国内延迟也很高,而引发网页打开速度慢. 一.常见的字体格式介绍 不同的浏览器对字体格式支持是不一致的,常见的如下: 1.TureTpe(.ttf) ...
- Python基础篇【第7篇】: 面向对象(2)
上一篇<初识面向对象>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公 ...
- EJB 教程推荐
EJB教程 EJB概述 EJB创建应用 EJB无状态Bean EJB有状态会话Bean EJB持久性 EJB消息驱动Bean EJB注解 EJB回调 EJB定时器服务 EJB依赖注入 EJB拦截器 E ...
- php使用file函数、fseek函数读取大文件效率分析
php读取大文件可以使用file函数和fseek函数,但是二者之间效率可能存在差异,本文章向大家介绍php file函数与fseek函数实现大文件读取效率对比分析,需要的朋友可以参考一下. 1. 直接 ...
- 安卓通用shell大全
一.[什么是shell] Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口.它是命令语言.命令解释程序及程序设计语言的统称.shell是用户和Linux内核之间的接口程序,如 ...
- java的向上转型总结
在<think of java>中对'向上转型'有着如下的描述 看完之后很蒙圈,所以自己在网上找了一些描述,并自己做了简单的总结 简单的例子 class A{ public void A1 ...
- 移动web初体验
1.可视宽度.物理宽度.虚拟宽度,通常自适应都是可视宽度满屏.即设置meta <meta name="viewport" content="width=device ...