刷leetcode第二天
反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
我的思路:一个指针指向开头,一个指向结尾,然后交换,往中间移动。
public void reverseString(char[] s) {
int i=0;
int j=s.length-1;
while(i<j)
{char temp=s[i];
s[i]=s[j];
s[j]=temp;
i++;
j--;
}
}
整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
我的思路:可能我的思路还是想把int整数转为STRing,然后跟字符串反转一样的操作,但是这样会忽略溢出的情况。
class Solution {
public int reverse(int x) {
int res = 0;
while(x!=0) {
//每次取末尾数字
int tmp = x%10;
//判断是否 大于 最大32位整数
if (res>214748364 || (res==214748364 && tmp>7)) {
return 0;
}
//判断是否 小于 最小32位整数
if (res<-214748364 || (res==-214748364 && tmp<-8)) {
return 0;
}
res = res*10 + tmp;
x /= 10;
}
return res;
}
}
字符串唯一的字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
s = “leetcode”
返回 0
s = “loveleetcode”
返回 2
我的思路:这道题用hashmap的时间并不是很快,而且空间复杂度也不好
这道题的思路主要是建立一个int[]数组,长26,然后将s变为字符数组,遍历字符数组,count[chars[i]-‘a’]++,最后再遍历count数组,如果值为1,就输出i
有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
我的思路:异位词就是单词所有字母都相同,但是位置排列不同,所以第一步先判断长度是否相同,不同就直接返回flase,然后将字符串1,2都变为字符数组,对字符数组进行排序,然后利用equals判断是否相同;
if(s.length()!=t.length())
{
return false;
}
char[] chars1=s.toCharArray();
char[] chars2=t.toCharArray();
Arrays.sort(chars1);
Arrays.sort(chars2);
return Arrays.equals(chars1,chars2);
验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
我的思路:输入的字符串,双指针,一个从头开始,一个从尾开始,然后判断是不是字符或者数字,如果不是,继续移动。
while(left<=right-1)
Character.isLetterOrDigit() 用这个函数前先要把
s=s.toLowerCase();
s.charAt(left);
字符串转为整数
字符串转换整数 (atoi)
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终结果。
注意:
本题中的空白字符只包括空格字符 ’ ’ 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
我的思路:要求就是给一个字符串,前面的空格都删掉,然后判断正负,同时还得判断大小。超过INT_MAXVALUE,需要将返回值设INT_MAXVALUE。
(这个判断很多题都会用,要记住)
s=s.trim(); //去除空格
if(s.length()==0)
{
return 0;
}
tirm()必须写在判断length的前面,不然会出现越界异常,比如“”,
while (index < length && chars[index] == ’ '){
index++;
}
// 极端情况 " " 和""
if(index >= length){
return 0;
}
if(s.charAt(index)’-’||s.charAt(index)’+’)
{
sign=s.charAt(index++)==’+’?1:-1;
}
for(;index<length;index++)
{
int digit=s.charAt(index)-‘0’; 将字符串中数字转为int
if(digit>9||digit<0)
{
break;
}
if(res>Integer.MAX_VALUE/10||(res==Integer.MAX_VALUE/10&&digit>Integer.MAX_VALUE%10))
{
return sign==1?Integer.MAX_VALUE:Integer.MIN_VALUE;
}
res=(res*10+digit); //这里判断溢出,要记住
//这里不能将res写成res=sign*res,这是在for循环里
}
首先strStr()
实现 strStr()
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = “hello”, needle = “ll”
输出: 2
我的思路,就是利用for循环,用substring截取大字符串中和小字符串一样大小的字符串,然后两者equals判断,如果相同,返回下标i;
return haystack.indexOf(needle);
int length=needle.length();
int total=haystack.length()-length+1;
for(int start=0;start<total;start++){
if(haystack.substring(start,start+length).equals(needle))
{
return start;
}
}
return -1;
外观数列
此处撰写解题思路
比较字符串的当前位 i 与上一位 i - 1 是否相等,StringBuffer对象res表示描述结果,
以“区间”表示每一段由连续相同字符组成的字符串:
1、相等:计数器num加1。特殊情况:若已到达字符串最后一位,此时还需执行将num和当前字符加入res的操作。
2、不相等:说明上一段区间已遍历完成,需要把上一段区间的num和字符加入res。特殊情况:若已到达字符串最后一位,
还需追加执行把最后一位字符加入res的操作。
public String countAndSay(int n) {
String s="1";
for(int i=0;i<n-1;i++)
{
s=describe(s);
}
return s;
}
public String describe(String s)
{
StringBuffer res=new StringBuffer();
if(s.length()==1)
{
res.append(1);
res.append(s);
}
int num=1;
for(int i=1;i<s.length();i++)
{
if(s.charAt(i)==s.charAt(i-1))
{
num++;
if(i==s.length()-1)
{
res.append(num);
res.append(s.charAt(i));
}
}
else{
res.append(num);
res.append(s.charAt(i-1));
num=1;
if(i==s.length()-1)
{
res.append(num);
res.append(s.charAt(i));
}
}
}
return res.toString();
}
最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
if (strs == null || strs.length == 0)
return "";
//默认第一个字符串是他们的公共前缀
String pre = strs[0];
int i = 1;
while (i < strs.length) {
//不断的截取
while (strs[i].indexOf(pre) != 0) //意思是不是共同部分就继续循环
pre = pre.substring(0, pre.length() - 1); //每次循环就变短
i++;
}
return pre;
}