代码随想录算法训练营第八天| 344. 反转字符串、541. 反转字符串 II、LCR 122. 路径加密、151. 反转字符串中的单词、LCR 182. 动态口令

LeetCode 344. 反转字符串
题目链接:344. 反转字符串 - 力扣(LeetCode)

​思路:

已经以数组的形式给出了,题目要求原地修改,直接使用双指针来实现就好。

#python
class Solution:
    def reverseString(self, s: List[str]) -> None:
        n=len(s)
        l,r=0,n-1
        while l<r:
            s[l],s[r]=s[r],s[l]
            l+=1
            r-=1
        return 
#java
class Solution {
    public void reverseString(char[] s) {
        int left = 0, right = s.length - 1;
        while (left < right) {
            s[left] = (char) (s[left] ^ s[right]);
            s[right] = (char) (s[left] ^ s[right]);
            s[left] = (char) (s[left] ^ s[right]);
            left++;
            right--;
        }
    }
}

困难与想法:

原地排序,两个指针相遇之后直接return就结束了


LeetCode 541. 反转字符串 II

题目链接:541. 反转字符串 II - 力扣(LeetCode)


思路:

注意讨论一下剩余字符的情况。我们可以想象每次都是向后跳跃2k个字符,所以用for循环挺好,规定了起点、终点、步长。

代码:

#python
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        n=len(s)
        s=list(s)
        for i in range(0,n,2*k):
            if i+2*k<=n or (i+k<=n and i+2*k>n):
                s[i:i+k]=s[i:i+k][::-1]
            elif i<=n and i+k>n:
                s[i:n]=s[i:n][::-1]
        return ''.join(s)
#java
class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i = 0; i < ch.length; i += 2 * k){
            int start = i;
            int end =Math.min(ch.length - 1, start + k -1);
            while(start < end){
                ch[start] ^= ch[end];
                // ch[start] ^= ch[end];
                ch[end] ^= ch[start];
                ch[start] ^= ch[end];
                start++;
                end--;
            }
        }
        return new String(ch);
    }
}

困难与想法:

第一种情况,加了2k还是小于n,那当然k内直接反转就好;

第二种情况,k<n<2k时,也是一样的k内反转就好,所以两种情况写在一起;

第三种情况,k>n了,那么就到n的部分反转呗;

上面三个情况可以直接切片,也可以自己用双指针来实现一个反转函数,但是其实做过一次就行,没必要每次都写反转函数的。


LeetCode LCR 122. 路径加密
题目链接:LCR 122. 路径加密 - 力扣(LeetCode)


思路:
不知道这题的意义是啥,遍历一下字符数组,把'.'换成' '就好了。

代码:

#python
class Solution:
    def pathEncryption(self, path: str) -> str:
        res=[]
        for c in path:
            if c=='.':
                res.append(' ')
            else:
                res.append(c)
        return ''.join(res)
#java
class Solution {
    public String pathEncryption(String path) {
        char[] ch = path.toCharArray();
        for(int i = 0; i < ch.length; i++){
            if(ch[i] == '.'){
                ch[i] = ' ';
            }
            else{
                continue;
            }
        }
        return new String(ch);
    }
}

困难与想法:

直接做就好


LeetCode 151. 反转字符串中的单词
题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)


思路:
注意两个问题,一个是空格,还有一个就是两次反转,但其实我更推荐直接使用队列来做,看下列的代码

代码:

#python
class Solution:
    def reverseWords(self, s: str) -> str:
        s=s.split()
        res=deque()
        for x in s:
            if x==' ':
                continue
            else:
                res.appendleft(x.strip())
        return " ".join(res).strip()
#java
class Solution {
    public String reverseWords(String s) {
        s = s.trim();
        String[] words = s.split("\\s+");
        int left = 0, right = words.length - 1;
        while(left < right){
            String tmp = words[left];
            words[left] = words[right];
            words[right] = tmp;
            left++;
            right--;
        }
        return String.join(" ", words);
    }
}

困难与想法:

最后记得返回字符串


LeetCode LCR 182. 动态口令
题目链接:LCR 182. 动态口令 - 力扣(LeetCode)


思路:
最简单的是直接切片就好,一行就搞定,但是一想到这种要反转的题就可以考虑双指针or双端队列,本题目就同双端队列来试试看。

代码:

#python
class Solution:
    def dynamicPassword(self, password: str, target: int) -> str:
        res=deque()
        for i in range(target):
            res.append(password[i])
        for i in range(len(password)-1,target-1,-1):
            res.appendleft(password[i])
        return ''.join(res)
#java
class Solution {
    public String dynamicPassword(String password, int target) {
        Deque<Character> deque = new ArrayDeque<>();
        for(int i = 0; i < target; i++){
            deque.offerLast(password.charAt(i));
        }
        for(int i = password.length() - 1; i >= target; i--){
            deque.offerFirst(password.charAt(i));
        }
        StringBuilder sb = new StringBuilder();
        for(char ch : deque){
            sb.append(ch);
        }
        return sb.toString();
    }
}

困难与想法:

最后记得返回字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别看了真C不了一点

打赏者皆为义父

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值