2021-04-06

刷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;

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值