【2024年华为OD机试】(B卷,100分)- 数组去重和排序(Java JS PythonC/C++)

在这里插入图片描述

一、问题描述

题目描述

给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。

输入描述

一个数组

输出描述

去重排序后的数组

用例

用例 1

输入:

1,3,3,3,2,4,4,4,5

输出:

3,4,1,2,5

解题思路

  1. 统计每个元素的出现次数

    • 使用一个哈希表(字典)来记录每个元素的出现次数。
    • 同时,记录每个元素第一次出现的位置,以便在出现次数相同的情况下,保持原始顺序。
  2. 构建带出现次数和原始索引的数组

    • 遍历原数组,将每个元素及其出现次数和第一次出现的索引存储在一个新的数组中。
  3. 排序

    • 使用自定义排序函数对新数组进行排序。
    • 排序的关键字是出现次数(降序)和原始索引(升序)。
  4. 提取排序后的元素

    • 从排序后的数组中提取元素,构建最终的去重排序后的数组。

详细步骤

  1. 读取输入

    • 从标准输入读取一个数组。
  2. 统计每个元素的出现次数和第一次出现的索引

    • 创建一个哈希表 countMap,键为元素,值为一个对象 { count: 0, firstIndex: -1 }
    • 遍历数组,更新每个元素的出现次数和第一次出现的索引。
  3. 构建带出现次数和原始索引的数组

    • 创建一个新数组 elements,每个元素是一个对象 { value, count, firstIndex }
    • 遍历原数组,将每个元素及其出现次数和第一次出现的索引添加到 elements 中。
  4. 排序

    • 使用 Array.prototype.sort 方法对 elements 进行排序。
    • 排序的关键字是出现次数(降序)和原始索引(升序)。
  5. 提取排序后的元素

    • 从排序后的 elements 中提取 value,构建最终的去重排序后的数组。
  6. 输出结果

    • 输出去重排序后的数组。

用例解释

用例 1
  • 输入:
    • 1,3,3,3,2,4,4,4,5
  • 输出:
    • 3,4,1,2,5

解释

  • 统计每个元素的出现次数:
    • 1 出现 1 次
    • 3 出现 3 次
    • 2 出现 1 次
    • 4 出现 3 次
    • 5 出现 1 次
  • 按照出现次数从高到低排序,相同出现次数按照第一次出现顺序排序:
    • 34 出现 3 次,3 先出现
    • 125 出现 1 次,1 先出现,2 次之,5 最后
  • 最终结果为 3,4,1,2,5

通过上述步骤,我们可以高效地对数组进行去重和排序,确保结果按出现次数从高到低排序,相同出现次数按第一次出现顺序排序。这种方法的时间复杂度主要由排序操作决定,为 O(n log n),其中 n 是数组的长度。

二、JavaScript算法源码

以下是 JavaScript 代码的详细中文注释和逻辑讲解


JavaScript 代码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline"); // 引入 readline 模块,用于读取控制台输入// 创建 readline 接口
const rl = readline.createInterface({input: process.stdin,  // 输入流为标准输入output: process.stdout, // 输出流为标准输出
});// 监听每一行输入
rl.on("line", (line) => {// 将输入行按逗号分隔成数组const arr = line.split(",");// 调用算法并输出结果console.log(getResult(arr));
});/* 算法逻辑 */
function getResult(arr) {// 定义两个对象:// count:用于统计每个字符串出现的次数// first:用于记录每个字符串第一次出现的索引const count = {};const first = {};// 遍历输入数组for (let i = 0; i < arr.length; i++) {const s = arr[i]; // 当前字符串// 统计字符串出现的次数if (count[s] == undefined) count[s] = 0; // 如果未记录过,初始化为 0count[s]++; // 次数加 1// 记录字符串第一次出现的索引if (first[s] == undefined) first[s] = i; // 如果未记录过,记录当前索引}// 返回排序后的结果return [...Object.keys(first)] // 获取所有字符串(去重).sort((a, b) =>// 排序规则:// 1. 按出现次数降序排列// 2. 如果出现次数相同,按第一次出现的索引升序排列count[a] != count[b] ? count[b] - count[a] : first[a] - first[b]).join(","); // 将排序后的数组用逗号拼接成字符串
}

代码逻辑讲解

1. 输入处理
  • 使用 readline 模块读取控制台输入。
  • 监听 line 事件,每次读取一行输入。
  • 将输入行按逗号分隔成数组 arr
2. 统计信息
  • 定义两个对象:
    • count:用于统计每个字符串出现的次数。
    • first:用于记录每个字符串第一次出现的索引。
  • 遍历数组 arr
    • 更新 count 中每个字符串的出现次数。
    • 更新 first 中每个字符串的第一次出现索引。
3. 排序规则
  • 使用 Object.keys(first) 获取所有字符串(去重)。
  • 对字符串数组进行排序:
    • 优先按出现次数降序排列。
    • 如果出现次数相同,按第一次出现的索引升序排列。
4. 输出结果
  • 将排序后的数组用逗号拼接成字符串并返回。

代码细节解析

1. readline 模块
  • 用于读取控制台输入。
  • rl.on("line", (line) => { ... }) 监听每一行输入。
2. split()
  • 将字符串按指定分隔符拆分成数组。
  • line.split(",") 将输入行按逗号分隔成数组。
3. count 对象
  • 用于统计每个字符串出现的次数。
  • count[s]++ 更新字符串 s 的出现次数。
4. first 对象
  • 用于记录每个字符串第一次出现的索引。
  • first[s] = i 记录字符串 s 的第一次出现索引。
5. Object.keys()
  • 获取对象的所有键(字符串)。
  • Object.keys(first) 获取所有字符串(去重)。
6. sort()
  • 对数组进行排序。
  • sort((a, b) => ...) 自定义排序规则:
    • 优先按出现次数降序排列。
    • 如果出现次数相同,按第一次出现的索引升序排列。
7. join()
  • 将数组拼接成字符串。
  • .join(",") 用逗号拼接数组。

示例运行

输入
apple,banana,apple,orange,banana,apple
步骤解析
  1. 输入行按逗号分隔成数组:
    • arr = ["apple", "banana", "apple", "orange", "banana", "apple"]
  2. 统计信息:
    • count = { apple: 3, banana: 2, orange: 1 }
    • first = { apple: 0, banana: 1, orange: 3 }
  3. 排序规则:
    • 按出现次数降序排列:
      • apple (3) > banana (2) > orange (1)
    • 如果出现次数相同,按第一次出现的索引升序排列。
  4. 排序后的数组:
    • ["apple", "banana", "orange"]
  5. 拼接成字符串:
    • "apple,banana,orange"
  6. 输出结果:apple,banana,orange

总结

  • 功能:统计字符串数组中每个字符串的出现次数,并按出现次数降序排列;如果次数相同,按第一次出现的索引升序排列。
  • 适用场景:处理字符串统计和排序问题。
  • 注意事项
    • 如果输入为空,结果为空字符串。
    • 如果所有字符串出现次数相同,按第一次出现的索引排序。

如果有其他问题,欢迎随时提问!

三、Java算法源码

以下是 Java 代码的详细中文注释和逻辑讲解


Java 代码

import java.util.HashMap; // 引入 HashMap,用于存储键值对
import java.util.Scanner; // 引入 Scanner,用于读取控制台输入
import java.util.StringJoiner; // 引入 StringJoiner,用于拼接字符串public class Main {public static void main(String[] args) {// 创建 Scanner 对象,用于读取控制台输入Scanner sc = new Scanner(System.in);// 读取一行输入,并按逗号分隔成字符串数组String[] arr = sc.nextLine().split(",");// 调用算法并输出结果System.out.println(getResult(arr));}// 算法逻辑public static String getResult(String[] arr) {// 定义两个 HashMap:// count:用于统计每个字符串出现的次数// first:用于记录每个字符串第一次出现的索引HashMap<String, Integer> count = new HashMap<>();HashMap<String, Integer> first = new HashMap<>();// 遍历输入数组for (int i = 0; i < arr.length; i++) {String s = arr[i]; // 当前字符串// 统计字符串出现的次数count.put(s, count.getOrDefault(s, 0) + 1); // 如果未记录过,初始化为 0,然后加 1// 记录字符串第一次出现的索引first.putIfAbsent(s, i); // 如果未记录过,记录当前索引}// 创建 StringJoiner 对象,用于拼接字符串StringJoiner sj = new StringJoiner(",");// 对字符串进行排序并拼接first.keySet().stream() // 获取所有字符串(去重).sorted((a, b) -> {// 排序规则:// 1. 按出现次数降序排列int countA = count.get(a);int countB = count.get(b);if (countA != countB) {return countB - countA; // 降序排列} else {// 2. 如果出现次数相同,按第一次出现的索引升序排列int firstA = first.get(a);int firstB = first.get(b);return firstA - firstB; // 升序排列}}).forEach(s -> sj.add(s)); // 将排序后的字符串添加到 StringJoiner 中// 返回拼接后的字符串return sj.toString();}
}

代码逻辑讲解

1. 输入处理
  • 使用 Scanner 读取控制台输入。
  • 将输入行按逗号分隔成字符串数组 arr
2. 统计信息
  • 定义两个 HashMap
    • count:用于统计每个字符串出现的次数。
    • first:用于记录每个字符串第一次出现的索引。
  • 遍历数组 arr
    • 更新 count 中每个字符串的出现次数。
    • 更新 first 中每个字符串的第一次出现索引。
3. 排序规则
  • 使用 first.keySet().stream() 获取所有字符串(去重)。
  • 对字符串进行排序:
    • 优先按出现次数降序排列。
    • 如果出现次数相同,按第一次出现的索引升序排列。
4. 输出结果
  • 使用 StringJoiner 将排序后的字符串拼接成逗号分隔的字符串并返回。

代码细节解析

1. Scanner
  • 用于读取控制台输入。
  • sc.nextLine() 读取一行输入。
  • split(",") 将输入行按逗号分隔成数组。
2. HashMap
  • 用于存储键值对。
  • count.put(s, count.getOrDefault(s, 0) + 1) 更新字符串 s 的出现次数。
  • first.putIfAbsent(s, i) 记录字符串 s 的第一次出现索引。
3. StringJoiner
  • 用于拼接字符串。
  • new StringJoiner(",") 创建一个以逗号分隔的拼接器。
  • sj.add(s) 将字符串 s 添加到拼接器中。
4. stream()
  • 将集合转换为流,便于操作。
  • first.keySet().stream() 获取所有字符串(去重)。
5. sorted()
  • 对流中的元素进行排序。
  • 自定义排序规则:
    • 优先按出现次数降序排列。
    • 如果出现次数相同,按第一次出现的索引升序排列。
6. forEach()
  • 对流中的每个元素执行操作。
  • sj.add(s) 将排序后的字符串添加到 StringJoiner 中。

示例运行

输入
apple,banana,apple,orange,banana,apple
步骤解析
  1. 输入行按逗号分隔成数组:
    • arr = ["apple", "banana", "apple", "orange", "banana", "apple"]
  2. 统计信息:
    • count = {apple=3, banana=2, orange=1}
    • first = {apple=0, banana=1, orange=3}
  3. 排序规则:
    • 按出现次数降序排列:
      • apple (3) > banana (2) > orange (1)
    • 如果出现次数相同,按第一次出现的索引升序排列。
  4. 排序后的数组:
    • ["apple", "banana", "orange"]
  5. 拼接成字符串:
    • "apple,banana,orange"
  6. 输出结果:apple,banana,orange

总结

  • 功能:统计字符串数组中每个字符串的出现次数,并按出现次数降序排列;如果次数相同,按第一次出现的索引升序排列。
  • 适用场景:处理字符串统计和排序问题。
  • 注意事项
    • 如果输入为空,结果为空字符串。
    • 如果所有字符串出现次数相同,按第一次出现的索引排序。

如果有其他问题,欢迎随时提问!

四、Python算法源码

以下是 Python 代码的详细中文注释和逻辑讲解


Python 代码

# 输入获取
arr = input().split(",")  # 读取控制台输入,并按逗号分隔成列表# 算法入口
def getResult(arr):# 定义两个字典:# count:用于统计每个字符串出现的次数# first:用于记录每个字符串第一次出现的索引count = {}first = {}# 遍历输入列表for i in range(len(arr)):s = arr[i]  # 当前字符串# 统计字符串出现的次数if count.get(s) is None:  # 如果未记录过,初始化为 0count[s] = 0count[s] += 1  # 次数加 1# 记录字符串第一次出现的索引if first.get(s) is None:  # 如果未记录过,记录当前索引first[s] = i# 获取所有字符串(去重)tmp = list(first.keys())# 对字符串进行排序tmp.sort(key=lambda x: (-count[x], first[x]))  # 排序规则:按出现次数降序排列,如果次数相同,按第一次出现的索引升序排列# 将排序后的列表用逗号拼接成字符串return ",".join(tmp)# 算法调用
print(getResult(arr))  # 输出结果

代码逻辑讲解

1. 输入处理
  • 使用 input() 读取控制台输入。
  • 将输入行按逗号分隔成列表 arr
2. 统计信息
  • 定义两个字典:
    • count:用于统计每个字符串出现的次数。
    • first:用于记录每个字符串第一次出现的索引。
  • 遍历列表 arr
    • 更新 count 中每个字符串的出现次数。
    • 更新 first 中每个字符串的第一次出现索引。
3. 排序规则
  • 使用 list(first.keys()) 获取所有字符串(去重)。
  • 对字符串进行排序:
    • 优先按出现次数降序排列。
    • 如果出现次数相同,按第一次出现的索引升序排列。
4. 输出结果
  • 将排序后的列表用逗号拼接成字符串并返回。

代码细节解析

1. input()
  • 用于读取控制台输入。
  • split(",") 将输入行按逗号分隔成列表。
2. 字典操作
  • count.get(s) is None:检查字符串 s 是否在字典中。
  • count[s] = 0:如果未记录过,初始化为 0。
  • count[s] += 1:更新字符串 s 的出现次数。
  • first.get(s) is None:检查字符串 s 是否在字典中。
  • first[s] = i:记录字符串 s 的第一次出现索引。
3. list(first.keys())
  • 获取字典 first 的所有键(字符串),并转换为列表。
4. sort()
  • 对列表进行排序。
  • key=lambda x: (-count[x], first[x]) 自定义排序规则:
    • 优先按出现次数降序排列(-count[x] 表示降序)。
    • 如果出现次数相同,按第一次出现的索引升序排列。
5. join()
  • 将列表拼接成字符串。
  • ",".join(tmp) 用逗号拼接列表。

示例运行

输入
apple,banana,apple,orange,banana,apple
步骤解析
  1. 输入行按逗号分隔成列表:
    • arr = ["apple", "banana", "apple", "orange", "banana", "apple"]
  2. 统计信息:
    • count = {"apple": 3, "banana": 2, "orange": 1}
    • first = {"apple": 0, "banana": 1, "orange": 3}
  3. 排序规则:
    • 按出现次数降序排列:
      • apple (3) > banana (2) > orange (1)
    • 如果出现次数相同,按第一次出现的索引升序排列。
  4. 排序后的列表:
    • ["apple", "banana", "orange"]
  5. 拼接成字符串:
    • "apple,banana,orange"
  6. 输出结果:apple,banana,orange

总结

  • 功能:统计字符串列表中每个字符串的出现次数,并按出现次数降序排列;如果次数相同,按第一次出现的索引升序排列。
  • 适用场景:处理字符串统计和排序问题。
  • 注意事项
    • 如果输入为空,结果为空字符串。
    • 如果所有字符串出现次数相同,按第一次出现的索引排序。

如果有其他问题,欢迎随时提问!

五、C/C++算法源码:

以下是 C++ 代码的详细中文注释和逻辑讲解


C++ 代码

#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>using namespace std;// 算法入口
string getResult(vector<string>& arr) {// 定义两个 map:// count:用于统计每个字符串出现的次数// first:用于记录每个字符串第一次出现的索引map<string, int> count;map<string, int> first;// 遍历输入数组for (int i = 0; i < arr.size(); i++) {string s = arr[i]; // 当前字符串// 统计字符串出现的次数if (count.find(s) == count.end()) { // 如果未记录过,初始化为 0count[s] = 0;}count[s]++; // 次数加 1// 记录字符串第一次出现的索引if (first.find(s) == first.end()) { // 如果未记录过,记录当前索引first[s] = i;}}// 获取所有字符串(去重)vector<string> tmp;for (auto& pair : first) {tmp.push_back(pair.first);}// 对字符串进行排序sort(tmp.begin(), tmp.end(), [&](const string& a, const string& b) {// 排序规则:// 1. 按出现次数降序排列if (count[a] != count[b]) {return count[a] > count[b];} else {// 2. 如果出现次数相同,按第一次出现的索引升序排列return first[a] < first[b];}});// 将排序后的列表用逗号拼接成字符串string result;for (int i = 0; i < tmp.size(); i++) {result += tmp[i];if (i != tmp.size() - 1) {result += ",";}}return result;
}int main() {// 输入获取string input;getline(cin, input); // 读取一行输入// 将输入按逗号分隔成数组vector<string> arr;size_t pos = 0;while ((pos = input.find(",")) != string::npos) {arr.push_back(input.substr(0, pos));input.erase(0, pos + 1);}arr.push_back(input); // 添加最后一个字符串// 算法调用cout << getResult(arr) << endl;return 0;
}

代码逻辑讲解

1. 输入处理
  • 使用 getline(cin, input) 读取控制台输入。
  • 将输入行按逗号分隔成字符串数组 arr
2. 统计信息
  • 定义两个 map
    • count:用于统计每个字符串出现的次数。
    • first:用于记录每个字符串第一次出现的索引。
  • 遍历数组 arr
    • 更新 count 中每个字符串的出现次数。
    • 更新 first 中每个字符串的第一次出现索引。
3. 排序规则
  • 使用 vector<string> tmp 存储所有字符串(去重)。
  • 对字符串进行排序:
    • 优先按出现次数降序排列。
    • 如果出现次数相同,按第一次出现的索引升序排列。
4. 输出结果
  • 将排序后的列表用逗号拼接成字符串并返回。

代码细节解析

1. getline(cin, input)
  • 用于读取控制台输入的一行内容。
2. 字符串分割
  • 使用 findsubstr 将输入行按逗号分隔成字符串数组 arr
3. map
  • 用于存储键值对。
  • count.find(s) == count.end():检查字符串 s 是否在 map 中。
  • count[s] = 0:如果未记录过,初始化为 0。
  • count[s]++:更新字符串 s 的出现次数。
  • first.find(s) == first.end():检查字符串 s 是否在 map 中。
  • first[s] = i:记录字符串 s 的第一次出现索引。
4. sort()
  • vector 进行排序。
  • 自定义排序规则:
    • 优先按出现次数降序排列(count[a] > count[b])。
    • 如果出现次数相同,按第一次出现的索引升序排列(first[a] < first[b])。
5. 字符串拼接
  • 使用 string result 存储结果。
  • 遍历排序后的列表,用逗号拼接字符串。

示例运行

输入
apple,banana,apple,orange,banana,apple
步骤解析
  1. 输入行按逗号分隔成数组:
    • arr = ["apple", "banana", "apple", "orange", "banana", "apple"]
  2. 统计信息:
    • count = {"apple": 3, "banana": 2, "orange": 1}
    • first = {"apple": 0, "banana": 1, "orange": 3}
  3. 排序规则:
    • 按出现次数降序排列:
      • apple (3) > banana (2) > orange (1)
    • 如果出现次数相同,按第一次出现的索引升序排列。
  4. 排序后的列表:
    • ["apple", "banana", "orange"]
  5. 拼接成字符串:
    • "apple,banana,orange"
  6. 输出结果:apple,banana,orange

总结

  • 功能:统计字符串数组中每个字符串的出现次数,并按出现次数降序排列;如果次数相同,按第一次出现的索引升序排列。
  • 适用场景:处理字符串统计和排序问题。
  • 注意事项
    • 如果输入为空,结果为空字符串。
    • 如果所有字符串出现次数相同,按第一次出现的索引排序。

如果有其他问题,欢迎随时提问!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/892581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《零基础Go语言算法实战》【题目 2-10】接口的实现

《零基础Go语言算法实战》 【题目 2-10】接口的实现 请指出下面代码中存在的问题。 type Programmer struct { Name string } func (p *Programmer) String() string { return fmt.Sprintf("print: %v", p) } func main() { p : &Programmer{} p.String()…

CAPL如何设置TCP/IP传输层动态端口范围

在TCP/IP协议中,应用程序通过传输层协议TCP/UDP传输数据,接收方传输层收到数据后,根据传输层端口号把接收的数据上交给正确的应用程序。我们可以简单地认为传输层端口号是应用程序的标识,这就是为什么我们说应用程序在使用TCP/IP协议通信时要打开传输层端口号或者绑定端口号…

C++ vtordisp的应用场景

文章目录 问题代码1. 基本概念回顾2. 应用场景虚继承与虚函数并存的类层次结构 3. 编译器相关考虑 问题代码 #include <iostream> using namespace std;class base { public:base() {}virtual void show() { cout << "base:: show"<<endl; } priv…

《DOM NodeList》

《DOM NodeList》 介绍 DOM&#xff08;文档对象模型&#xff09;是HTML和XML文档的编程接口&#xff0c;它允许开发者在JavaScript等编程语言中操作文档的结构、样式和内容。在DOM中&#xff0c;NodeList是一个重要的接口&#xff0c;它表示一个包含节点&#xff08;如元素、…

Git:merge合并、冲突解决、强行回退的终极解决方案

首先还是得避免冲突的发生&#xff0c;无法避免时再去解决冲突&#xff0c;避免冲突方法&#xff1a; 时常做pull、fatch操作&#xff0c;不要让自己本地仓库落后太多版本&#xff1b;在分支操作&#xff0c;如切换分支、合并分支、拉取分支前&#xff0c;及时清理Change&#…

2025网络架构

一、园区网络概述。 园区网络典型层次和区域&#xff1a; 核心层&#xff1a;是园区网骨干&#xff0c;是园区数据交换的核心&#xff0c;联接园区网的各个组成部分&#xff0c;如数据中心、管理中心、园区出口等。汇聚层&#xff1a;处于园区网的中间层次&#xff0c;完成数据…

Vue.config.productionTip = false 不起作用的问题及解决

文章目录 一、问题描述二、解决方法 一、问题描述 当我们在代码页面上引入Vue.js(开发版本)时&#xff0c;运行代码会出现以下提示&#xff0c;这句话的意思是&#xff1a;您正在开发模式下运行Vue&#xff0c;在进行生产部署时&#xff0c;请确保打开生产模式 You are runni…

【经管数据】ZF数字采购采购明细数据(2015.3-2024.3)

一、数据来源&#xff1a; 原始数据来源为ZF采购网。数据涵盖了自2015年3月至2024年3月的ZF数字采购合同明细&#xff0c;反映了数字化转型在政府采购中的应用情况。 二、参考文献&#xff1a; [1] 申志轩, 祝树金, 文茜, 等. ZF数字采购与企业数字化转型[J]. 数量经济技术经济…

啥!GitHub Copilot也免费使用了

文章目录 前言免费版直接修复代码多文件上下文Agent模式总结 前言 最近&#xff0c;GitHub 给开发者们带来了一个好消息&#xff1a;他们的 AI 编程助手 GitHub Copilot 现在可以免费使用了&#xff01;以前&#xff0c;每个月要花 10 美元才能享受的服务&#xff0c;现在对所…

013:深度学习之神经网络

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 深度学习是机器学习中重要的一个学科分支&#xff0c;它的特点就在于需要构建多层且“深度”的神经网络。 人们在探索人工智能初期&#xff0c;就曾设想构建一个用数学方式…

【C++boost::asio网络编程】使用asio协程搭建异步echo服务器的笔记

【Cboost::asio网络编程】使用asio协程搭建异步服务器的笔记 协程和线程关系以及线程和进程的关系简单区分资源消耗与开销调度与上下文切换并发性独立性 main函数listener函数echo函数 协程和线程关系以及线程和进程的关系简单区分 资源消耗与开销 进程与线程&#xff1a; 进…

Redis的各种操作

使用golang语言实现了各种redis的实现 包括初始化redisDb,在服务重启时需要删除的 redis 缓存,对redis里的值进行自增操作并设置过期时间,简单分布式锁,set,get,ttl,delete等等。 哎嘿&#xff0c;你就看吧&#xff0c;一看一个不吱声。 func InitRedisDB(cfg *dbridgeredis.Re…

【NLP】语言模型的发展历程 (1)

语言模型的发展历程系列博客主要包含以下文章&#xff1a; 【NLP】语言模型的发展历程 (1)【NLP】大语言模型的发展历程 (2) 本篇博客是该系列的第一篇&#xff0c;主要讲讲 语言模型&#xff08;LM&#xff0c;Language Model&#xff09; 的发展历程。 文章目录 一、统计语…

JNI使用类签名及字段签名获取字段值

1.获取逻辑: 2.获取逻辑实现代码: extern "C" JNIEXPORT void JNICALL Java_com_example_jnibasetypedemo_MainActivity_getAnimalsNameFromJNI(JNIEnv *env, jobject thiz,jobjectArray animals) {jobject animalObj;int len env->GetArrayLength(animals);//获…

从 PostgreSQL 中挽救损坏的表

~/tmp-dir.dab4fd85-8b47-4d9a-b15c-18312ef61075 pg_dump -U postgres -h locathost www_p1 > wow_p1.sqlpg_dump&#xff1a;错误&#xff1a;转储表 “page_views” 的内容失败&#xff1a;PQgetResult() 失败。pg_dump&#xff1a;详细信息&#xff1a;来自服务器的错误…

Vue 封装公告滚动

文章目录 需求分析1. 创建公告组件Notice.vue2. 注册全局组件3. 使用 需求 系统中需要有一个公告展示&#xff0c;且这个公告位于页面上方&#xff0c;每个页面都要看到 分析 1. 创建公告组件Notice.vue 第一种 在你的项目的合适组件目录下&#xff08;比如components目录&a…

asp.net core webapi 并发请求时 怎么保证实时获取的用户信息是此次请求的?

对于并发请求&#xff0c;每个请求会被分配到一个独立的线程或线程池工作线程上。通过 HttpContext 或 AsyncLocal&#xff0c;每个线程都能独立地获取到它自己的上下文数据。由于这些数据是与当前请求相关的&#xff0c;因此在并发请求时不会互相干扰。 在并发请求时&#xf…

Win10微调大语言模型ChatGLM2-6B

在《Win10本地部署大语言模型ChatGLM2-6B-CSDN博客》基础上进行&#xff0c;官方文档在这里&#xff0c;参考了这篇文章 首先确保ChatGLM2-6B下的有ptuning AdvertiseGen下载地址1&#xff0c;地址2&#xff0c;文件中数据留几行 模型文件下载地址 &#xff08;注意&#xff1…

HTTP-响应协议

HTTP的响应过程&#xff1f; 浏览器请求数据--》web服务器过程&#xff1a;请求过程 web服务器将响应数据-》到浏览器&#xff1a;响应过程 响应数据有哪些内容&#xff1f; 1.和请求数据类似。 2. 响应体中存储着web服务器返回给浏览器的响应数据。并且注意响应头和响应体之间…

深入解析 Python 2 与 Python 3 的差异与演进

Python 2 和 Python 3 是 Python 编程语言的两个主要版本。Python 3 于 2008 年发布&#xff0c;旨在解决 Python 2 中的一些设计缺陷&#xff0c;并引入了许多新特性。虽然 Python 2 在很长一段时间内仍然被广泛使用&#xff0c;但自 2020 年 1 月 1 日起&#xff0c;Python 2…