剑指offer——面试题42-1:左旋转字符串

力扣,https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/description/

Python

class Solution:
    def dynamicPassword(self, password: str, target: int) -> str:
        new_password = password + password
        n = len(password)
        start = target
        end = target + n
        return new_password[start: end]

Java

class Solution {
    public String dynamicPassword(String password, int target) {
        if (target == 0) {
            return password;
        }
        int size = password.length();
        String str = password + password;

        return str.substring(target, target + password.length());
    }
}

20180906整理
##Solution1:
自己最开始想出来的垃圾算法!!!

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int i = 0;
        for(i = 0; i < n; i++) {
            LeftMoveOne(str);
        }
        return str;
    }
    
    void LeftMoveOne(string &str){
        char temp = str[0];
        for(int i = 1; i < str.size(); i++)
            str[i-1] = str[i];
        str[str.size() - 1] = temp;
        return;
    }
};

##Solution2:
20180906重做。此算法稍好一点

class Solution {
public:
    string LeftRotateString(string str, int n) {
        if (str.size() <= 1 || n == 0) return str;
        int mod = n % str.size();
        if (!mod) return str;
        return str.substr(mod) + str.substr(0, mod);
    }
};

再稍微改进一点点。。

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int len = str.length();
        if(len == 0) return "";
        n = n % len;
        str += str;
        return str.substr(n, len);
    }
};

##Solution3:
比较巧妙的一种算法,主要考察三次翻转。
原理: Y X = ( X T Y T ) T YX = (X^TY^T)^T YX=(XTYT)T
PS:这种描述原理的方式还真是简单粗暴,清晰易懂~~~

class Solution {
public:
    string LeftRotateString(string str, int n) {
        if (str.size() <= 1 || n == 0) return str;
        int mod = n % str.size();
        if (!mod) return str;
        reverse(str.begin(), str.begin() + mod);
        reverse(str.begin() + mod, str.end());
        reverse(str.begin(), str.end());
        return str;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值