【语法】STL中size()的坑

一、题目和困难

牛客网NC50940 Running Median

题目大意是给一段数字序列,当给出了奇数个数字时,求已给出的序列的中位数

思路就是维护一个大顶堆和一个小顶堆,控制大顶堆的数字个数跟小顶堆一样或者大顶堆比小顶堆多一个。当给出了奇数个数字时,大顶堆的数字个数比小顶堆多一个,大顶堆的堆顶就是中位数。

核心代码:

for(int i=1;i<=M;i++){
	if((i)%20==1) printf("\n");
	int num;
	scanf("%d",&num);
	if(i==1)	h.push(num);
	else{
		if(h.top()<num) g.push(num);
		else h.push(num);
		while(h.size()-g.size()>1){
			g.push(h.top());
			h.pop();
		}
		while(g.size()>h.size()){
			h.push(g.top());
			g.pop();
		}
	}

但这个代码样例都过不了,说是内存超限

调试时出现了一个诡异的现象

 很明显这就是问题所在

二、解决

查资料发现size()返回的是一个无符号数,两个无符号数相减,如果结果小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用Python检测C++代码的循环变量是否是char类型,可以使用正则表达式匹配代码的for循环,并从循环语句提取循环变量的类型。可以使用以下代码实现: ```python import re # 示例C++代码 cpp_code = """ for (char i = 0; i < v.size(); i++) { // 循环体 } """ # 匹配for循环语句 pattern = r'for\s*\(\s*(\w+)\s+(\w+)\s*=\s*0\s*;\s*(\w+)\s*<\s*(\w+)\.size\s*\(\s*\)\s*;\s*(\w+)\s*\+\+\s*\)' match = re.search(pattern, cpp_code) if match: loop_var_type = match.group(1) # 提取循环变量类型 if loop_var_type == 'char': print('循环变量是char类型') else: print('循环变量不是char类型') else: print('未找到for循环语句') ``` 要检测循环的终止条件是否是一个STLsize,可以使用AST(Abstract Syntax Tree,抽象语法树)来分析代码结构。可以使用Python的`ast`模块将C++代码转换为AST,然后从AST提取循环的终止条件。可以使用以下代码实现: ```python import ast # 示例C++代码 cpp_code = """ for (char i = 0; i < v.size(); i++) { // 循环体 } """ # 将C++代码转换为AST cpp_ast = ast.parse(cpp_code) # 遍历AST查找for循环语句 for node in ast.walk(cpp_ast): if isinstance(node, ast.For): # 循环的终止条件是v.size() if isinstance(node.test, ast.Compare) and isinstance(node.test.right, ast.Attribute) and node.test.right.attr == 'size': print('循环的终止条件是一个STLsize') else: print('循环的终止条件不是一个STLsize') ``` 需要注意的是,这种方法可能无法检测所有情况,因此仍然需要手动检查代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值