第七届字节跳动青训营第三课 | 豆包MarsCode AI 刷题

144 阅读5分钟

这是我参与「第七届青训营 」伴学笔记创作活动的第3天

今天的代码练习题目是:

字符串最短循环子串

问题描述

小M在研究字符串时发现了一个有趣的现象:某些字符串是由一个较短的子串反复拼接而成的。如果能够找到这个最短的子串,便可以很好地还原字符串的结构。你的任务是给定一个字符串,判断它是否是由某个子串反复拼接而成的。如果是,输出该最短的子串;否则,输出空字符串""

例如:当输入字符串为 abababab 时,它可以由子串 ab 反复拼接而成,因此输出 ab;而如果输入 ab,则该字符串不能通过子串的重复拼接得到,因此输出空字符串。

测试样例

样例1:

输入:inp = "abcabcabcabc"
输出:'abc'

样例2:

输入:inp = "aaa"
输出:'a'

样例3:

输入:inp = "abababab"
输出:'ab'

样例4:

输入:inp = "ab"
输出:''

样例5:

输入:inp = "abcdabcdabcdabcd"
输出:'abcd'

样例6:

输入:inp = "b"
输出:''

题目解析

首先将每一种可能的字符串切出来,然后通过循环比较,字串通过取余循环,来判断是否为循环字串,如果j走到了最后,那么当前的字串就是他的循环字串,因为是从小的串开始,如果j走到了最后那么就不会切更大的字串直接跳出循环,保证了是最小的字串,如果i走到最后还没有找到,那么结果就是“”。

代码如下:

public class Main { public static String solution(String inp) { int n = inp.length(); for (int len = 1; len <= n / 2; len++) { // Check lengths from 1 to n / 2 if (n % len == 0) { // Only consider lengths that divide the string length evenly String substring = inp.substring(0, len); // Get the potential repeating substring StringBuilder sb = new StringBuilder();

            // Build the string from repeating the substring
            for (int j = 0; j < n / len; j++) {
                sb.append(substring);
            }

            // Check if the built string is equal to the original string
            if (sb.toString().equals(inp)) {
                return substring; // Found the repeating substring
            }
        }
    }
    return ""; // If no substring found, return empty string
}

public static void main(String[] args) {
    // Add your test cases here
    System.out.println(solution("abcabcabcabc").equals("abc")); // Should print true
    System.out.println(solution("aaa").equals("a")); // Should print true
    System.out.println(solution("abababab").equals("ab")); // Should print true
    System.out.println(solution("ab").equals("")); // Should print true
    System.out.println(solution("abcdabcdabcdabcd").equals("abcd")); // Should print true
    System.out.println(solution("b").equals("")); // Should print true
}

}

学习方法与心得

今天想和大家分享的是我这几天的编写程序的心得与方法

首先,我认为编程前的准备是必不可少的。

在开始编写程序之前,充分的准备工作至关重要。首先是对问题的理解,明确程序要实现的功能和目标。例如,如果要编写一个学生成绩管理系统,就要清楚需要处理哪些数据,如学生的基本信息、各科成绩,以及需要实现的功能,像成绩录入、查询、统计等。这一步如同建筑的蓝图设计,是后续编程的指导方向。

其次是选择合适的编程语言和开发工具。不同的项目有不同的语言偏好,比如网页开发可能会选择 JavaScript、Python 等,而系统级编程可能会使用 C、C++。开发工具也有很多种,如 Visual Studio Code、IntelliJ IDEA 等,选择熟悉且适合项目的工具可以提高效率。

然后,我发现编程过程中的要点也是要相对明确的。

在编写代码阶段,保持清晰的逻辑是关键。将复杂的问题分解成一个个小的模块,每个模块实现一个特定的功能。以刚才的成绩管理系统为例,可以将其分为数据输入模块、数据存储模块、查询模块等。这样可以使代码结构更加清晰,易于调试和维护。

代码的可读性也不容忽视。使用有意义的变量名和函数名,遵循统一的代码风格,比如代码的缩进、括号的使用等。例如,用“studentName”表示学生姓名变量,而不是简单的“s”。同时,添加适当的注释来解释代码的功能和逻辑,尤其是复杂的算法部分。这不仅方便自己日后回顾代码,也有利于团队协作。

此外,要善于利用现有的代码库和框架。许多编程语言都有丰富的开源库,如 Python 的 NumPy、Pandas 等,可以节省大量的开发时间。在使用这些库时,要仔细阅读文档,了解其功能和使用方法。

最后,调试与优化的过程也需要我们去认真对待。

编写程序不可能一蹴而就,调试是必经的过程。当程序出现错误时,不要慌张。可以通过打印输出中间结果、使用调试工具等方法来定位问题。对于一些逻辑错误,要仔细检查代码的执行流程和条件判断。

在程序功能实现后,还需要进行优化。优化包括算法优化和代码性能优化。例如,选择更高效的排序算法,或者减少不必要的内存占用。但要注意优化的平衡,不要为了微小的性能提升而使代码变得过于复杂难以理解。

总之,编写程序是一个富有挑战性和创造性的过程,需要不断地学习、实践和总结,才能编写出高质量的程序。