NC719 牛牛与字符串3(视频讲解+4种语言代码)

牛牛与字符串3

https://www.nowcoder.com/practice/ff33127a91934d2da054f75c7047f6e5?tpId=196&&tqId=37707&rp=1&ru=/ta/job-code-total&qru=/ta/job-code-total/question-ranking

- 题目描述:
图片说明
- 题目链接:

https://www.nowcoder.com/practice/ff33127a91934d2da054f75c7047f6e5?tpId=196&&tqId=37707&rp=1&ru=/ta/job-code-total&qru=/ta/job-code-total/question-ranking
- 设计思想:


图片说明
图片说明
图片说明
-视频讲解链接B站视频讲解
- 复杂度分析:

- 代码:
c++版本:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回与该字符串循环同构所有字符串中字典序最小的起始位置
     * @param s string字符串 代表题意中的s
     * @return int整型
     */
    int solve(string s) {
        // write code here
        int len = s.size();
         int i = 0, j = 1, k = 0, t;  
        while(i < len && j < len && k < len) {
            //如果前后两个字符相同,那么k++;
            t = s[(i + k) >= len ? i + k - len : i + k] - s[(j + k) >= len ? j + k - len : j + k];  
            if(!t) k++;  
            else{  
                if(t > 0) i = i + k + 1;  //表明前段比后段大 那么前段肯定不能作为前缀
                else j = j + k + 1;  //后段较大 那么后段就往后 推一下
                if(i == j) ++ j;  //同一位置的话j移动
                k = 0; //每次更新位置要k要从0开始控制
            }  
        }  
        return (i < j ? i : j)+1;  
    }
};

Java版本:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回与该字符串循环同构所有字符串中字典序最小的起始位置
     * @param s string字符串 代表题意中的s
     * @return int整型
     */
    public int solve (String s) {
        // write code here
        //i指向最小表示的位置,j作为比较指针
        int len = s.length();
        int i = 0, j = 1, k = 0, t;  
        while(i < len && j < len && k < len) {
            //如果前后两个字符相同,那么k++;
            t = s.charAt((i + k) >= len ? i + k - len : i + k) - s.charAt((j + k) >= len ? j + k - len : j + k); 
            if(t == 0) k++;  
            else{  
                if(t > 0) i = i + k + 1;  //表明前段比后段大 那么前段肯定不能作为前缀
                else j = j + k + 1;  //后段较大 那么后段就往后 推一下
                if(i == j) ++ j;  //同一位置的话j移动
                k = 0; //每次更新位置要k要从0开始控制
            }  
        }  
        return (i < j ? i : j)+1;  
    }
}

Python版本:

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 返回与该字符串循环同构所有字符串中字典序最小的起始位置
# @param s string字符串 代表题意中的s
# @return int整型
#
class Solution:
    def solve(self , s ):
        # write code here
        #i指向最小表示的位置,j作为比较指针
        n = len(s);
        i,j,k,t = 0,1,0,0
        while(i < n and j < n and k < n):
            #如果前后两个字符相同,那么k++;
            t = ord(s[(i + k - n) if (i + k) >= n else i + k]) - ord(s[j + k - n if (j + k) >= n else j + k])
            if(t == 0): k += 1
            else:
                if(t > 0): i = i + k + 1#表明前段比后段大 那么前段肯定不能作为前缀
                else: j = j + k + 1#后段较大 那么后段就往后 推一下
                if(i == j): j += 1#同一位置的话j移动
                k = 0#每次更新位置要k要从0开始控制
        return (i if i < j else j) + 1

JavaScript版本:

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 返回与该字符串循环同构所有字符串中字典序最小的起始位置
 * @param s string字符串 代表题意中的s
 * @return int整型
 */
function solve( s ) {
    // write code here
        //i指向最小表示的位置,j作为比较指针
        let len = s.length;
        let i = 0, j = 1, k = 0, t;  
        while(i < len && j < len && k < len) {
            //如果前后两个字符相同,那么k++;
            t = s[(i + k) >= len ? i + k - len : i + k].charCodeAt() - s[(j + k) >= len ? j + k - len : j + k].charCodeAt();  
            if(!t) k++;  
            else{  
                if(t > 0) i = i + k + 1;  //表明前段比后段大 那么前段肯定不能作为前缀
                else j = j + k + 1;  //后段较大 那么后段就往后 推一下
                if(i == j) ++ j;  //同一位置的话j移动
                k = 0; //每次更新位置要k要从0开始控制
            }  
        }  
        return (i < j ? i : j)+1;  
}
module.exports = {
    solve : solve
};
牛客题霸 文章被收录于专栏

本专栏主要是牛客题霸习题的讲解,有详细的考点分类,大家可以可以看看呦!!!

全部评论

相关推荐

Ryan188:我觉得你简历最核心的问题就是太大众化。 你要有一个认知就是,如果你是面试官,你是HR,其实他们每天都会收到非常多大量重复的像你这种简历。 就是说你的项目不是一个真实的上线的项目,可能是从网上学习而来的,或者是直接copy别人的项目,没有新意,没有展现出你自己对技术的思考,而且你的学历也不占优,自然而然就很难有人去选择你。 所以要做的实际上是差异化方向的工作,也就是“给我一个选择你的理由”,比如最近很火的ai,你可以写一个ai相关项目比如问答应用或者mcp编写或者agent搭建,需要你先花点时间学习,34天吧,展现你对这方面相较于其他人特有的思考; 或者写相关技术博客输出一些技术内容,有具体可以量化的成果等等去增加你的竞争力。 但以上这些都是后话,我去年在你这个时候也是没人理我,咱们双非学历也没实习,难找也正常,我当时整个3月份都没人鸟我,直到有个新招的岗位,很缺人很急,流程很快,所以我一下子进去了,所以运气方面也很重要,需要你一直坚持喝复盘,直到看到光明,加油兄弟
简历被挂麻了,求建议
点赞 评论 收藏
分享
03-03 23:42
复旦大学 Java
_无论云泥意贯一:把复旦大学放前面,山东大学放后面,并且在两个大学后面标注985(用一些显眼的颜色标注)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务