备战秋招day5

算法

344. 反转字符串

class Solution {
    public void reverseString(char[] s) {
        //拿一个中间变量来承载即可
        int l = 0;
        int r = s.length-1;
        while(l<r){
            char tmp = s[l];
            s[l] = s[r];
            s[r] = tmp;
            l++;
            r--;
        }
    }
}

541. 反转字符串 II

class Solution {
    public String reverseStr(String s, int k) {
        char[] cs = s.toCharArray();
        StringBuffer sb = new StringBuffer();
        int len = s.length();
        for(int i = 0;i<len;i+=2*k){
            int start = i;
            //算一下够不够2k
            int end = Math.min(start+k-1,len-1);
            while(start<end){
                char tmp = cs[start];
                cs[start] = cs[end];
                cs[end] = tmp;
                start++;
                end--;
            }
        }
        return new String(cs);
    }
}

151. 反转字符串中的单词

class Solution {
    /**
     * 不使用Java内置方法实现
     * <p>
     * 1.去除首尾以及中间多余空格
     * 2.反转整个字符串
     * 3.反转各个单词
     */
    public String reverseWords(String s) {
        //去除空格
        StringBuilder sb = removeSpace(s);
        //翻转整个字符串
        reverseString(sb, 0, sb.length() - 1);
        //然后翻转各个单词
        reverseEachWord(sb);
        return sb.toString();
    }
    //去除空格
    public StringBuilder removeSpace(String s){
        //先去除前后空格
        int start = 0;
        int end = s.length() - 1;
        //如果为空就往前/后
        while(s.charAt(start) == ' ') start++;
        while(s.charAt(end) == ' ') end--;
        StringBuilder res = new StringBuilder();
        //此时去检测中间空格
        while(start <= end){
            char c = s.charAt(start);
            if(c != ' ' || c == ' ' && s.charAt(start-1) != ' '){
                res.append(c);
            }
            start++;
        }
        return res;
    }
    //翻转整个字符串
    public void reverseString(StringBuilder sb, int start, int end) {
        while (start < end) {
            char temp = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));
            sb.setCharAt(end, temp);
            start++;
            end--;
        }
    }
    //翻转各个单词
    public void reverseEachWord(StringBuilder sb) {
        //用start来标记所有单词的起始位置
        int start = 0;
        //用end来记录所有单词的结束位置
        int end = 1;
        //记录最长
        int len = sb.length();
        while(end < len){
            //首先得找到每个单词,也就是先找到某个单词的结尾
            while(end<len && sb.charAt(end)!=' '){
                end++;
            }
            //找到结尾了就反转(传入下标)
            reverseString(sb,start,end-1);
            //去找下一个单词,在此之前需要跳过上一个单词与这一个单词的空格
            start = end + 1;
            end = start + 1;
        }
    }
}

459. 重复的子字符串

class Solution {
    public boolean repeatedSubstringPattern(String s) {
        int len = s.length();
        StringBuilder sb = new StringBuilder();
        //如果走到一半都没有找到,那么肯定无法构成
        for(int i = 0;i < len/2;i++){
            sb.append(s.charAt(i));
            if(len % sb.length() != 0){
                continue;
            }
            //拿tmp来去判断是否可以重复构成
            StringBuilder tmp = new StringBuilder(sb);
            //记录当前重复构成的子串
            String now = tmp.toString();
            while(tmp.length() <= len){
                if(tmp.length() == len && s.equals(tmp.toString())){
                    return true;
                }else if(s.contains(tmp.toString())){
                    //重复拼接子串
                    tmp.append(now);
                }else{
                    break;
                }
            }
        }
        return false;
    }
}

思考

这里针对昨天所做的一些题进行回顾一下,主要是两数之和,三数之和,四数之和。

这几道题其实思想都是类似的,挑选几个数,并且排序后就方便做的情况

那么难点其实就是在于去重以及每次选数来放到集合里面去。

其实四数之和就是多套了层的三数之和,我们最多同时操作两个数,那么考虑使用双指针的方法来做,即针对三数之和,就是先挑出一个,再挑两个;对于四数之和,就是现在挑出一个,再挑出一个,再挑两个。


补充知识点

今天补充的知识点有存储引擎和索引两方面的内容:

InnoDB如何解决幻读问题的?/ MySQL如何解决幻读问题的

B树和B+树的区别

什么是聚集索引和非聚集索引

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值