力扣_字符串

反转字符串

// 使用双指针法,初始状态是一个在最左边一个在最右边。
// 然后最左最右交换元素,直至左右指针相遇
class Solution {
    public void reverseString(char[] s) {

        //求s的数组长度
        int n = s.length;

        //设计左右指针
        int l = 0;
        int r = n-1;

        //开始交换
        for(;l < r;l++,r--){
            char temp = s[l];
            s[l] = s[r];
            s[r] = temp;
        }
    }
}
 

整数反转

//设置一个变量rev用于存入交换的数字
//每次将传入参数除余10得到最后一位元素end
//然后将变量rev乘以10,加上最后一位元素end
//循环直到传入参数为0
//因为要将rev乘以10,所以要判断要不要是不是出界

class Solution {
    public int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {
                return 0;
            }
            int digit = x % 10;
            x /= 10;
            rev = rev * 10 + digit;
        }
        return rev;
    }
}
 

字符串中的第一个唯一字符

//设置一个数组,长度为26,用来保存字符串s中a~z出现的次数
//第一次循环字符串是用来保存字符串中a~z中出现的次数
//第二次循环是寻找字符串中第一个出现次数为1的位置

class Solution {
    public int firstUniqChar(String s) {

        //设置数组t
        int[] t = new int[26];
        //求数组s的长度
        int n = s.length();
        //第一次循环
        for(int i =  0;i < n;i++){
            t[s.charAt(i) - 'a']++;
        }
        for(int i = 0;i < n;i++){
            if(t[s.charAt(i) - 'a'] == 1){
                return i;
            }
        }
        return -1;
    }
}
 

有效的字母异位词

//设置两个数组a1和a2用来分别保存字符串s和t穿线字母的个数
//循环判断a1和a2中字母的个数是否相同

class Solution {
    public boolean isAnagram(String sString t) {

        //设置数组
        int[] a1 = new int[26];
        int[] a2 = new int[26];

        //保存字符串s和t的长度
        int n1 = s.length();
        int n2 = t.length();

        //如何两者长度不一样直接出错
        if(n1 != n2){
            return false;
        }

        //循环保存字符串s和t中字母出现的个数
        for(int i = 0;i < n1;i++){
            a1[s.charAt(i) - 'a']++;
        }

        for(int i = 0;i < n2;i++){
            a2[t.charAt(i) - 'a']++;
        }
        
        //循环判断字符串s和t中字母出现的个数是否相同
        for(int i = 0; i < 26;i++){
            if(a1[i] != a2[i]){
                return false;
            }
        }
        
        return true;
    }
}
 

验证回文串

//将传入字符串中的数字和字母保存到新字符串中,并且将传入字符串的大写字母变成小写字母
//判断是否为回文串

class Solution {
    public boolean isPalindrome(String s1) {
        
        //传入字符的长度
        int n = s1.length();
        //设置新字符串
        StringBuffer sb = new StringBuffer();
        //保存传入字符串中的字母和数字
        for(int i = 0; i < n;i++){
            //暂存传入字符串中的字母
            char ch = s1.charAt(i);
            //判断传入字母是否为数字和字母
            if(Character.isLetterOrDigit(ch)){
                sb.append(Character.toLowerCase(ch));
            }
        }
        //求新字符串的长度
        int n2 = sb.length();
        //设置新字符串用于保存上一字符串的倒置
        StringBuffer sb2 = new StringBuffer(sb).reverse();
        //判断字符串是否为回文串
        for(int i = 0;i < n2;i++){
            if(sb.charAt(i) != sb2.charAt(i)){
                return false;
            }
        }
        return true;

    }
}
 

字符串转换整数 (atoi)

//去除字符串中的空格字符
//如果字符串的长度为0,则返回0
//如果字符串的第一个字符不是数字也不是加减号,则返回0
//如果第一个字符是正号,则保存后续数字
//如果第一个字符是负号,则保存后续数字
//如果第一个字符是数字,则保存这个数字以及后续数字
class Solution {
    public int myAtoi(String s) {
        if (s.length() == 0) {
            return 0;
        }
        int res = 0;
        int i = 0, sign;

        while (s.charAt(i) == ' ') {
            if (++i >= s.length()) {
                return 0;
            }
        }
        if (s.charAt(i) == '+' || Character.isDigit(s.charAt(i))) {
            sign = 1;
            if (s.charAt(i) == '+') {
                i++;
            }
        } else if (s.charAt(i) == '-') {
            sign = -1;
            i++;
        } else {
            return 0;
        }

        while (i < s.length() && Character.isDigit(s.charAt(i))) {
            int num = s.charAt(i) - 48;
            if ((sign == 1) && (res > (Integer.MAX_VALUE - sign * num) / 10)) {
                return Integer.MAX_VALUE;
            } else if ((sign == -1) && (res < (Integer.MIN_VALUE - sign * num) / 10)) {
                return Integer.MIN_VALUE;
            }
            res = 10 * res + sign * num;
            i++;
        }
        return res;
    }
}
 

实现 strStr()

//求字符串和子串的长度,若字符串和子串的长度都为0,则返回0
//若字符串的长度小于子串的长度,则返回-1
//暴力法判断子串是否存在于字符串中,若存在则返回起始值,若不存在则返回-1
class Solution {
    public int strStr(String haystackString needle) {
       //求字符串和子串的长度
       int n1 = haystack.length();
       int n2 = needle.length();
       //字符串和子串的长度都为0
       if(n1 == 0 && n2 == 0){
           return 0;
       }
       //判断字符串的长度是否大于子串的长度
       if(n1 < n2){
           return -1;
       }
       //判断子串是否在字符串中出现
       for(int i = 0;i + n2 <= n1;i++){
           int j = 0;
           for(;j < n2;j++){
               if(haystack.charAt(i+j) != needle.charAt(j)){
                   break;
               }
           }
           if(j == n2){
               return i;
           }
       }
       return -1;
    }
}
 
 

外观数列

//重点就是求出同一数字出现几次
class Solution {
    public String countAndSay(int n) {
        //输入:n = 1 输出:"1"
        String ret = "1";
        for(int i = 2;i <= n;i++){
            StringBuffer sb = new StringBuffer();
            int start = 0;
            int post = 0;
            //求出同一数字出现几次,并存入到sb
            while(post < ret.length()){
                while(post < ret.length() && ret.charAt(post) == ret.charAt(start)){
                    post++;
                }
                sb.append(Integer.toString(post-start)).append(ret.charAt(start));
                start = post;
            }
            ret = sb.toString();
        }
        return ret;
    }
}
 
 

最长公共前缀

//先求strs[0]与strs[1]的最长前缀
//在用求得的最长前缀与strs[2]求它俩的最长前缀
//循环下去

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0 || strs == null){
            return "";
        }
        //求数组长度
        int n = strs.length;
        //假设最长前缀为strs[0]
        String prefix = strs[0];
        //循环取最长前缀
        for(int i = 1;i < n;i++){
            prefix = Prefix(prefix,strs[i]);
        }
        return prefix;
    }
    
    //求最长前缀
    public String Prefix(String str1,String str2){
        //求str1和str2的长度
        int n1 = str1.length();
        int n2 = str2.length();
        int n = 0;
        if(n1 < n2){
            n = n1;
        }else{
            n = n2;
        }
        int temp = 0;
        for(int i = 0;i < n;i++){
            if(str1.charAt(i) == str2.charAt(i)){
                temp++;
            }else{
                break;
            }
        }
        return str1.substring(0,temp);
    }
}
posted @ 2022-03-07 15:24  Space-guan  阅读(34)  评论(0)    收藏  举报