热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
本提示词专为开发者与学习者设计,可根据具体的算法任务(如排序)和编程语言(如Python),快速生成标准的代码实现,提升编程与学习效率。输入与输出参数用于生成测试代码,以及自动进行成功性验证。
下面给出稳定的归并排序实现与示例验证。该算法按升序输出新列表,不修改原输入,并在元素相等时保持原有相对顺序(稳定性)。
实现思路与逻辑:
代码:
from typing import List
def merge_sort(amounts: List[int]) -> List[int]:
"""
稳定的归并排序:对非负整数列表进行升序排序。
不修改输入列表,返回新的排序结果。
"""
# 基本输入检查(可按需放宽或移除)
if not isinstance(amounts, list):
raise TypeError("amounts必须为列表类型")
if any((not isinstance(x, int)) or x < 0 for x in amounts):
raise ValueError("amounts中所有元素必须为非负整数")
# 空列表或单元素列表直接返回其副本
n = len(amounts)
if n <= 1:
return amounts[:] # 返回副本,确保不修改原输入
def merge(left: List[int], right: List[int]) -> List[int]:
merged = []
i = j = 0
# 稳定归并:相等时优先取left[i],保持稳定性
while i < len(left) and j < len(right):
if left[i] <= right[j]:
merged.append(left[i])
i += 1
else:
merged.append(right[j])
j += 1
# 追加剩余部分
if i < len(left):
merged.extend(left[i:])
if j < len(right):
merged.extend(right[j:])
return merged
mid = n // 2
left_sorted = merge_sort(amounts[:mid])
right_sorted = merge_sort(amounts[mid:])
return merge(left_sorted, right_sorted)
# 示例与验证
if __name__ == "__main__":
amounts = [23, 5, 5, 89, 12]
original = amounts[:] # 保存原列表副本
sorted_amounts = merge_sort(amounts)
# 验证:原列表未变、结果已排序、长度一致
assert amounts == original, "错误:输入列表被修改"
assert all(sorted_amounts[i] <= sorted_amounts[i + 1] for i in range(len(sorted_amounts) - 1)), "错误:结果未按升序排序"
assert len(sorted_amounts) == len(original), "错误:结果长度与输入不一致"
print("输入 amounts:", amounts)
print("排序结果:", sorted_amounts)
# 示例输出应为:[5, 5, 12, 23, 89]
下面给出一个可直接运行的 Java 实现,输入为有向图邻接表 Map<Integer, List
实现思路与逻辑简介
完整代码
import java.util.*;
/**
* Dijkstra 最短路(非负权重),输入为邻接表 Map<Integer, List<Edge>> 和源点 sourceId。
* 输出最短距离与前驱,用于路径还原与调度优化。
*/
public class DijkstraShortestPaths {
public static final double EPS = 1e-12;
// 图的边
public static class Edge {
public final int to;
public final double weight;
public Edge(int to, double weight) {
this.to = to;
this.weight = weight;
}
@Override
public String toString() {
return "->" + to + "(" + weight + ")";
}
}
// 结果封装:最短距离与前驱
public static class DijkstraResult {
public final Map<Integer, Double> dist; // 最短距离
public final Map<Integer, Integer> prev; // 前驱
public DijkstraResult(Map<Integer, Double> dist, Map<Integer, Integer> prev) {
this.dist = dist;
this.prev = prev;
}
}
// 小根堆中的结点条目
private static class NodeDist {
int node;
double dist;
NodeDist(int node, double dist) {
this.node = node;
this.dist = dist;
}
}
/**
* 计算从 sourceId 出发到各节点的最短距离与前驱。
* 约束:权重必须非负。
*/
public static DijkstraResult dijkstra(Map<Integer, List<Edge>> graph, int sourceId) {
if (graph == null) throw new IllegalArgumentException("graph is null");
// 收集所有节点(包括仅出现在目标端的节点)
Set<Integer> nodes = new HashSet<>(graph.keySet());
for (Map.Entry<Integer, List<Edge>> e : graph.entrySet()) {
List<Edge> edges = e.getValue();
if (edges == null) continue;
for (Edge edge : edges) {
if (edge == null) continue;
if (edge.weight < 0) {
throw new IllegalArgumentException("Negative edge weight detected from " +
e.getKey() + " to " + edge.to + ": " + edge.weight);
}
nodes.add(edge.to);
}
}
nodes.add(sourceId);
// 初始化距离与前驱
Map<Integer, Double> dist = new HashMap<>();
Map<Integer, Integer> prev = new HashMap<>();
for (int v : nodes) {
dist.put(v, Double.POSITIVE_INFINITY);
}
dist.put(sourceId, 0.0);
// 最小堆(按距离)
PriorityQueue<NodeDist> pq = new PriorityQueue<>(Comparator.comparingDouble(nd -> nd.dist));
pq.offer(new NodeDist(sourceId, 0.0));
while (!pq.isEmpty()) {
NodeDist cur = pq.poll();
double bestKnown = dist.getOrDefault(cur.node, Double.POSITIVE_INFINITY);
if (cur.dist > bestKnown + EPS) {
// 惰性删除:堆中旧条目
continue;
}
List<Edge> edges = graph.getOrDefault(cur.node, Collections.emptyList());
for (Edge edge : edges) {
if (edge == null) continue;
int v = edge.to;
double nd = cur.dist + edge.weight;
double old = dist.getOrDefault(v, Double.POSITIVE_INFINITY);
if (nd + EPS < old) {
dist.put(v, nd);
prev.put(v, cur.node);
pq.offer(new NodeDist(v, nd));
}
}
}
return new DijkstraResult(dist, prev);
}
/**
* 从前驱表还原 source->target 的路径。如果 target 不可达,返回空列表。
*/
public static List<Integer> reconstructPath(Map<Integer, Integer> prev, int source, int target) {
LinkedList<Integer> path = new LinkedList<>();
Integer cur = target;
while (cur != null) {
path.addFirst(cur);
if (cur == source) break;
cur = prev.get(cur);
}
if (path.isEmpty() || path.getFirst() != source) return Collections.emptyList();
return path;
}
/**
* 计算路径总权重(若路径非法或边不存在则返回正无穷)。
*/
public static double pathWeight(Map<Integer, List<Edge>> graph, List<Integer> path) {
if (path == null || path.size() <= 1) return 0.0;
double sum = 0.0;
for (int i = 0; i + 1 < path.size(); i++) {
int u = path.get(i), v = path.get(i + 1);
double w = Double.POSITIVE_INFINITY;
for (Edge e : graph.getOrDefault(u, Collections.emptyList())) {
if (e.to == v) {
w = e.weight;
break;
}
}
if (Double.isInfinite(w)) return Double.POSITIVE_INFINITY;
sum += w;
}
return sum;
}
/**
* 基本校验:
* - 源点距离为 0
* - 不可达点距离为正无穷(或在 dist 中缺失也可);
* - 从前驱还原的路径合法且其总权重等于 dist。
* - 任意边 (u->v) 满足 dist[v] <= dist[u] + w(最短路必要条件)。
*/
public static void validate(Map<Integer, List<Edge>> graph, int source, DijkstraResult res) {
Objects.requireNonNull(res);
Objects.requireNonNull(res.dist);
Objects.requireNonNull(res.prev);
double sourceDist = res.dist.getOrDefault(source, Double.POSITIVE_INFINITY);
if (Math.abs(sourceDist - 0.0) > EPS) {
throw new AssertionError("Source distance is not 0: " + sourceDist);
}
// 收集所有节点
Set<Integer> nodes = new HashSet<>(graph.keySet());
for (Map.Entry<Integer, List<Edge>> e : graph.entrySet()) {
for (Edge edge : e.getValue()) nodes.add(edge.to);
}
nodes.add(source);
// 前驱路径一致性与三角不等式检查
for (int v : nodes) {
double dv = res.dist.getOrDefault(v, Double.POSITIVE_INFINITY);
if (!Double.isInfinite(dv)) {
// 能到达:用前驱还原路径并比对距离
List<Integer> path = reconstructPath(res.prev, source, v);
if (path.isEmpty()) {
throw new AssertionError("Reachable node without a valid predecessor path: " + v);
}
double w = pathWeight(graph, path);
if (Math.abs(dv - w) > 1e-9) {
throw new AssertionError("Distance mismatch at node " + v + ": dist=" + dv + ", pathWeight=" + w);
}
}
// 三角不等式:对所有边 (u->v) 检查 dist[v] <= dist[u] + w
// 也能间接发现负权或不一致
}
for (Map.Entry<Integer, List<Edge>> e : graph.entrySet()) {
int u = e.getKey();
double du = res.dist.getOrDefault(u, Double.POSITIVE_INFINITY);
for (Edge edge : e.getValue()) {
double dv = res.dist.getOrDefault(edge.to, Double.POSITIVE_INFINITY);
if (du + edge.weight + 1e-9 < dv) {
throw new AssertionError("Triangle inequality violated at edge " + u + "->" + edge.to);
}
}
}
}
// 示例:可按需删除或保留
public static void main(String[] args) {
Map<Integer, List<Edge>> graph = new HashMap<>();
addEdge(graph, 1, 2, 2);
addEdge(graph, 1, 3, 5);
addEdge(graph, 2, 3, 1);
addEdge(graph, 2, 4, 2);
addEdge(graph, 3, 4, 1);
addEdge(graph, 4, 5, 3);
int source = 1;
DijkstraResult res = dijkstra(graph, source);
System.out.println("Distances:");
res.dist.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEach(e -> System.out.println(" " + e.getKey() + " -> " + e.getValue()));
System.out.println("Predecessors:");
res.prev.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEach(e -> System.out.println(" " + e.getKey() + " <- " + e.getValue()));
// 还原 1->5 的路径
List<Integer> path = reconstructPath(res.prev, source, 5);
System.out.println("Path 1->5: " + path + ", weight=" + pathWeight(graph, path));
// 校验
validate(graph, source, res);
System.out.println("Validation passed.");
}
// 辅助:添加边
private static void addEdge(Map<Integer, List<Edge>> graph, int u, int v, double w) {
graph.computeIfAbsent(u, k -> new ArrayList<>()).add(new Edge(v, w));
}
}
使用说明
下面给出完整的 JavaScript 实现与简要说明。该实现返回所有匹配起始下标(递增且无重复),并同时返回构造的前缀表(LPS,最长前后缀表)以便验证。
代码(基于 UTF-16 代码单元匹配,适用于 ASCII 与常见 Unicode 文本的日志场景):
function kmpSearch(text, pattern) { if (typeof text !== 'string' || typeof pattern !== 'string') { throw new TypeError('text 与 pattern 必须是字符串'); }
const m = pattern.length; const n = text.length; if (m === 0) return { indices: [], lps: [] };
const lps = buildLPS(pattern); const indices = [];
let i = 0; // text 指针 let j = 0; // pattern 指针
while (i < n) { if (text[i] === pattern[j]) { i++; j++; if (j === m) { const start = i - m; indices.push(start); // 查找到一个匹配后,利用 LPS 继续尝试下一个(支持重叠匹配) j = lps[j - 1]; } } else { if (j !== 0) { // 发生不匹配,利用 LPS 回退 pattern 指针 j = lps[j - 1]; } else { // j 已在开头,只能推进 text 指针 i++; } } }
// 断言:每个下标处子串等于 pattern,且结果有序无重复
for (let k = 0; k < indices.length; k++) {
const idx = indices[k];
if (text.substr(idx, m) !== pattern) {
throw new Error(断言失败:下标 ${idx} 处子串不等于 pattern);
}
if (k > 0 && indices[k] <= indices[k - 1]) {
throw new Error('断言失败:返回的下标未严格递增或有重复');
}
}
return { indices, lps };
// 构造 LPS(Longest Prefix Suffix)前缀表 function buildLPS(pat) { const lps = new Array(pat.length).fill(0); let len = 0; // 当前最长前后缀长度 for (let i = 1; i < pat.length; ) { if (pat[i] === pat[len]) { len++; lps[i] = len; i++; } else { if (len !== 0) { len = lps[len - 1]; } else { lps[i] = 0; i++; } } } return lps; } }
// 示例 const text = "ERROR_42: ok; ERROR_42: fail"; const pattern = "ERROR_42"; console.log(kmpSearch(text, pattern)); // 期望输出:{ indices: [0, 14], lps: [...] }
实现思路与逻辑简述:
说明:
帮助用户快速生成符合业务需求的算法代码及其实现说明,满足开发、学习或项目需求的场景,提升开发效率和知识掌握。
帮助算法工程师快速从需求到代码,节省开发时间,专注于核心算法优化
辅助编程入门者从零生成完整代码,陪伴他们逐步理解算法实现逻辑
支持教学使用,可用于算法设计课程展示与学生实践练习,加深其理解
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
免费获取高级提示词-优惠即将到期