union联合体
一、Union 联合体的定义Union 是一种特殊的数据类型,允许在同一个内存位置存储不同的数据类型。其主要特点是:
共享内存空间:union 类型是共享内存的,以最大的成员的大小作为整个 union 的大小。
存储地址相同:联合体中的各数据的存储地址都是相同的。
二、为什么要使用 Union?
节省内存:
当多个数据项不会同时使用时
在嵌入式系统等内存受限环境中特别有用
数据类型转换:
dev.to 提到可用于类型转换(type punning)
允许以不同方式解释同一块内存
实际应用场景: 一个银行账户的例子:
1234union AccountInfo { struct Person personal; struct Company business;};
一个账户要么是个人账户,要么是企业账户,不会同时是两种。
三、Union 的关键特性
内存分配规则:
12345union U1 { int n; // 4字节 double d; // 8字节 char s[11]; // 11 ...
unsigned long
❗易错点 1:unsigned long 在不同平台长度不同long 曾经比int大,因为int很早是2字节,但是在windows上一样
平台
编译模型
unsigned long 大小
Windows 64/32位
LLP64/LP64
4字节(32位)
Linux/macOS 64位
LP64
8字节(64位)
现代C++最佳实践使用#include<cstdint>,基于C++11标准,跨平台编程,使用下面的类型
类型
含义
int8_t
8位有符号整数
uint8_t
8位无符号整数
int16_t
16位有符号整数
uint16_t
16位无符号整数
int32_t
32位有符号整数
uint32_t
32位无符号整数
int64_t
64位有符号整数
uint64_t
64位无符号整数
size_tsize_t表示内存中可寻址的最大大小,其大小与平台的指针大小(地址总线宽度)相关。
1#include <cstddef> // size_t 定义在这里
...
滴滴试题1
给定一个数组,包含电能(可正可负)与对应的价格,每个数组元素只能选一次,求以最小的价格,达到电能总和为1,如果不存在,则返回-1.
这是一个“带负权的 0/1 子集和最小代价”问题。每个元素只能选一次,能量可正可负,要求选出若干元素使能量和恰为 1,且价格之和最小。
两种通用做法:
字典 DP(推荐,简单易写):用字典维护“能量和 -> 最小价格”,逐个物品转移。适合 n 较大、但可达状态不爆炸的场景。
分治 Meet-in-the-Middle(适合 n ≤ 40):把数组分成两半,枚举两边所有子集,合并得到目标和。
Python 实现
字典 DP(能量/价格为整数)1234567891011121314151617181920212223242526272829303132from typing import List, Tupledef min_price_to_energy_one(items: List[Tuple[int, int]]) -> int: """ items: [(energy, ...
滴滴试题2
每次把当前全局最大值减 1、全局最小值加 1,做 k 次(如果中途已不能再缩小差值则提前结束),问此时最大值与最小值的差。
123456789101112131415161718192021222324252627282930313233343536373839404142from collections import Counterfrom math import ceildef range_after_k(nums, k): n = len(nums) if n <= 1: return 0 s = sum(nums) lo_target = s // n hi_target = (s + n - 1) // n # ceil(s/n) # 最少需要的步数,若 k 足够大则直接给出最终差值 need = sum(max(0, a - hi_target) for a in nums) if k >= need: return 0 if s % n == 0 else 1 cnt = Co ...
最长回文子串
容易超时的情况:全是相同字符串
不对的方法:O(n^3)123456789101112131415161718192021222324252627282930313233## 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可## # @param A string字符串 # @return int整型#class Solution: def getLongestPalindrome(self , A: str) -> int: max_length = 1 for ind,i in enumerate(A): numbers_to_be_process = [] for j in range(ind+1,len(A)): if A[ind]==A[j]: numbers_to_be_process.append(j) for next_ind in numbers_t ...
判断是不是完全二叉树
to debug:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = None## 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可## # @param root TreeNode类 # @return bool布尔型#from typing import Tupleclass Solution: def isCompleteTree(self , root: TreeNode) -> bool: depth = 1 choices = [root] def next_loop(choices:List[TreeNode])->Tupl ...
BM66 最长公共子串LCS(Longest Common Substring)和 BM65 最长公共子序列(二)
最长公共子串LCS描述给定两个字符串str1和str2,输出两个字符串的最长公共子串
题目保证str1和str2的最长公共子串存在且唯一。
要求: 空间复杂度 O(n2)O(n2),时间复杂度 O(n2)O(n2)
暴力解法:枚举法基本思路枚举法是最直观的暴力解法,通过比较所有可能的子串组合来找到最长的公共子串。
具体实现步骤
遍历所有起始位置:
遍历 str1 的每个字符作为子串的起始位置 i。
遍历 str2 的每个字符作为子串的起始位置 j。
扩展子串:
从 i 和 j 开始,逐个字符比较 str1 和 str2。
如果字符相等,则继续向后比较,增加当前子串长度。
如果字符不等,则停止扩展,记录当前子串长度。
维护最大值:
在每次找到公共子串时,比较其长度与当前最大值,更新最大值及其位置。
代码实现123456789101112131415def longest_common_substring(str1, str2): max_len = 0 end_pos = 0 # 记录最长子串在str1中的结束位置 for i in ...
比赛
BIEO 中O的标注会计算准确率吗一般会,注意,没有输出的就是O标签,不在span里[[adaseq踩坑记录:unpicklable]]
错误分析:行号-原因/方法
1232 poi-》community+road22 BIE不闭合
高基数离散特征对于树模型和神经网络模型的影响大小
这是一个非常棒且非常实际的问题。高基数离散特征(High-Cardinality Categorical Features)是机器学习工程师经常需要处理的一个棘手问题,它对不同模型的影响差异很大。
高基数离散特征是指某个类别型特征包含大量不同的取值(类别),比如:*用户ID、商品SKU、设备ID*邮政编码、IP地址(未经分段的)*公司名称、产品名称
这些特征的核心挑战在于:取值数量多,但每个取值下的样本数量很少。这会导致统计上的不稳定性。
下面我们分别分析它对树模型和神经网络的影响。
1. 对树模型(决策树、随机森林、梯度提升机如XGBoost/LightGBM/CatBoost)的影响树模型通过递归地根据特征的值对数据进行划分来学习。对于离散特征,常见的分裂方式是“是否属于某个子集”。
负面影响(较大):1.过拟合(Overfitting)风险极高:这是最核心的问题。树模型可以轻松地创建一个分裂,将每个唯一的类别值分配到自己的叶子节点中。例如,它可以直接用“用户ID”进行分裂,每个ID一个分支。这会导致模型完全记忆训练数据,而不是学习一般化模式,从而在测试集上表 ...