【小练】day1

news2024/11/20 7:13:28

day1

选择题

1. 以下for循环的执行次数是()。

for(x=0,y=0;(y=123)&&(x<4);×++);

A 是无限循环
B 循环次数不定
C 4
D 3

本题主要考察for

for(初始化部分;条件判断部分;调整部分)

初始化部分只执行一次。

&&:控制求值顺序——两边都为真才为真,若左边为假,直接判断为假,右边不判断。

(y=123)是一个赋值语句,赋值返回的结果是123,恒为真。所以x=[0, 3]共4次,选D。

2. 以下程序的运行结果是()。

int main()
{
	printf("%s, %5.3s\n","computer", "computer");
	return 0;
}

A computer, puter
B computer, com
C computer, computer
D computer, compu.ter

本题主要考察printf的字符串格式控制

对于printf(“%M.Ns”):

  • M:打印的宽度
    • M>0:右对齐 M<0:左对齐
    • 多的补空格
  • N:从左边开始,拿N个字符打印

所以题中printf(“%5.3s”)的意思是:

  • M>0,右对齐,打印的宽度为5,多的补空格
  • 左边开始,拿3个字符

" com" 空格空格com,选B。

3. 下列main()函数执行后的结果为()

int func()
{
	int i,j,k=0;
	for(i=0, j=-1;j=0;i++, j++)
	{
		k++}
	return k;
}
	int main()
	{
	cout<<(func())}

A -1

B 0

C 1

D 2

仍然考察for循环。j=0的返回值恒为假,初始化后,发现判断条件为假,就根本不会进for,返回k,即0,打印。选B。

4. 下面程序输出是什么?

#include <stdio.h>
int main()
{
	int a=1,b=2, c=3,d=0if(a == 1 && b++ == 2)
	if(b!=2 || c-- !=3)
	printf("%d,%d,%d\n",a,b,c)else
	printf("%d,%d,%d\n" ,a,b,c)else
	printf("%d, %d,%din",a,b,c)return 0;
}

A 1, 2, 3
B 1, 3, 2
C 1, 3, 2
D 1, 3, 3

本题考察if else的匹配

根据else的特性:会匹配最近的if。

我们可以找第一个else,匹配“if(b!=2llc–!=3)”,这两个拉走之后,第二个else就匹配"if(a == 1 8& b++==2)"。

第一个if是可以进的,判断后b自增至3。所以第二个if也能进,||控制求值顺序,判断为真后直接跳出。a=1 b=3 c=3。D

5. 若有定义语句:int a=10;double b=3.14;则表达式 A+a+b 值的类型是()

A char
B int
C double
D float

用相近类型直接进行计算,会发生自动类型转换(提升):精度低 ==> 精度高。C

6. 在int p[][4]={ {1}, {3,2}, {4,5,6}, {0} };中,p[1][2]的值是()

A 1
B 0
C 6
D 2

本题考察数组的特性

p是一行有4个int的二维数组,按照一对花括号一行的原则初始化

[1, 0, 0, 0]

[3, 2, 0, 0]

[4, 5, 6, 0]

[0, 0, 0, 0]

B

7. 选择表达式 11|10 的结果(本题数值均为十进制)

A 11
B 10
C 8
D 2

本题考察进制转换和位运算

对于数值不大的“十进制转二进制”,我们可以凑

11 = 8 + 2 + 1 = 2^3 + 2^1 + 2^0

= 0000 1011

10 = 8 + 2 = 2^3 + 2^1

= 0000 1010

按位或|:1是老大,每位上有1则1

0000 1011 | 0000 1010

1111121= 0000 1011 —— 选A

对于数值较大的“十进制转二进制”,我们可以“除2倒取余”的方法。

具体见文末。

8. fun(21)运行结果是()

int fun(int a)
{
	a^=(1<<5) -1return a;
}

A 10
B 5
C 3
D 8

本题考察位运算

  • a ^= (1<<5) - 1:a = a ^ (1<<5) - 1

  • 1 << 5 - 1

    • (0000 0001 << 5 ) - 1 =
    • 0010 0000 - 1 = 31
  • a = 21:

    a = 21 ^ 31

    0001 0101 ^

    0001 1111 =

    0000 1010 = 10(十进制)

选A。

9. 若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是

A *p+=1;
B (*p)++;
C ++(*p);
D *p++;

A:解引用找到year,year += 1
B:解引用找到year,对其后置++。此语句后,year++
C:解引用找到year,对其前置++。year在当前语句++。
D:的优先级比*(解引用)高,但因为是后置++,所以先对p解引用找到year,但什么也没对year做,而后p++,让它跳过一个int(指针的加减见文末)。

选D。

10. 下面关于"指针"的描述不正确的是()

A 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B 32位系统下任何类型指针的长度都是4个字节
C 指针的数据类型声明的是指针实际指向内容的数据类型
D 野指针是指向未分配或者已经释放的内存地址

A:free函数仅进行释放空间的操作,不会自动将指针变量置空。(free对NULL也是什么都不做的)

B:没问题。不管你类型的大小是多大,32位机器下,都是用32个二进制位来标识地址,也就是4个字节

C:没问题。

D:没问题。


总结

printf的格式控制

对于printf(“%M.Ns”):

  • M:打印的宽度
    • M>0:右对齐
    • M<0:左对齐
    • 多的补空格
  • N:从左边开始,拿N个字符打印

控制求值顺序

&&||都可以控制求值顺序——能判断出结果直接得出结果,不进行后面的操作和判断。



编程题

1. 组队竞赛

题目描述:

牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。
例如:
一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。
如样例所示:
如果牛牛把6个队员划分到两个队伍
如果方案为:
team1:{1,2,5}, team2:{5,5,8}, 这时候水平值总和为7.
而如果方案为:
team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为10.
没有比总和为10更大的方案,所以输出10.

输入描述:
输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)

第二行包括3*n个整数a_i(1 ≤ a_i ≤ 10^9),表示每个参赛选手的水平值.
输出描述:
输出一个整数表示所有队伍的水平值总和最大值.

示例1

输入
2
5 2 8 5 1 5
输出
10

分析

读完题目,可以了解:

我们需要分组,最大化 “每组的第二大水平值总和”。换句话说,每组的次大都要尽可能大。怎么做?

需要 一个最大的,一个次大的,一个最小的, 来组成一组。拿一个最大的是为了次大的能成为次大,否则这个次大就是最大了,而我们尽可能大的次大已经拿到,剩下的一个就拿一个最小的,来保证最大化中值。

但这代码咋写啊,没头绪呢。“手过”个样例试试。

这样就需要排序。比如,将 [2, 4, 5, 1, 3, 8, 7, 9, 6] 排序,得到[1, 2, 3, 4, 5, 6, 7, 8, 9]

组1:[1, 8, 9] 9来保证次大,1来保证来保证最大化中值。

组2:[2, 6, 7] 7来保证次大,2来保证来保证最大化中值。

组3:[3, 4, 5] 5来保证次大,3来保证来保证最大化中值。

8 + 6 + 4 = 18 即是每组都拿到尽可能大的次大

那这个次大,怎么来?

[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

0 1 2 3 4 5 6 7 8

组1的次大8,下标是7

组2的次大6,下标是5

组3的次大4,下标是3

可以推出公式:次大下标 = 数组长度 - 2(组数i +1)*

7 = 9 - 2*1

5 = 9 - 2*2

3 = 9 - 2*3

代码

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    vector<int> arr;
    arr.resize(3 * n);
    
    for(int i = 0; i < 3*n; ++i)
        cin >> arr[i];
    
    sort(arr.begin(), arr.end());
    
    int sum = 0;
    for(int i = 0; i< n; ++i)
    {
        //次大的下标
        int index = arr.size() - 2 *(i+1);
        sum += arr[index];
    }

    
    cout << sum << endl;
    
    return 0;
}

在这里插入图片描述

过了大部分用例,但是数据量大的时候崩了,能想到是int溢出,sum给上一个long即可

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    vector<int> arr;
    arr.resize(3 * n);
    
    for(int i = 0; i < 3*n; ++i)
        cin >> arr[i];
    
    sort(arr.begin(), arr.end());
    
    long sum = 0;
    for(int i = 0; i< n; ++i)
    {
        //次大的下标
        int index = arr.size() - 2 *(i+1);
        sum += arr[index];
    }

    
    cout << sum << endl;
    
    return 0;
}

在这里插入图片描述

总结

明白题意,能手过样例,但代码不知道怎么写:写出用例,把过程总结成代码


2. 删除公共字符

描述

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

输入描述:

每个测试输入包含2个字符串

输出描述:

输出删除后的字符串

示例1

输入:

They are students. 
aeiou

输出:

Thy r stdnts.

分析

读完题可以知道,要在第一个字符串中删除第二个字符串中的所有元素。

怎么删除?遍历第一个字符串,如果发现当前字符是第二个字符串中的任意一个,删除。

我们这里采用hash映射的思想。

hash映射:构建一个足够大的数组,每个下标对应的元素,是“下标值”出现过的次数。

什么意思呢?就是把值映射成下标,具体位置记录次数,比如

对于int数组[1, 1, 3, 4, 5],我们要映射进hash内(有相对映射和绝对映射两种,此处讲解相对映射)

构建足够大的数组:因为最大值达到了5,我们 int hash[6]

hash: [0, 0, 0, 0, 0, 0, 0]

下标 0 1 2 3 4 5 6

遍历数组[1, 1, 3, 4, 5],发现1出现两次,那么在hash内,把1的值映射成下标,就是hash[1],hash内的元素记录次数,所以hash[1]应该是2。遍历完成应该是这样:

hash: [0, 2, 0, 1, 1, 1, 0]

下标 0 1 2 3 4 5 6

这样能极大加快效率,把第二个字符串映射到hash数组,遍历第一个字符串的时候,想对比当前字符是不是要删除的,就可以通过下标直接访问:如果是0就没出现过,反之就要删除。

代码

#include <iostream>
#include <vector>
using namespace std;

int main() 
{
    string s;
    string del;//要删除的
    getline(cin, s);
    getline(cin, del);

    //hash映射
    //构建hash数组:因为char的范围是[-128,127],所以128个元素就足够大
    vector<int> hash;
    hash.resize(128);

    //映射
    for(int i = 0; i < del.size(); ++i)
    {
        ++hash[del[i]];//将值映射成下标,记录次数
    }
		
  	//直接删除麻烦,我们选不删除的保存起来吗,最后再赋给s
    string tmp;
    for(int i = 0; i < s.size(); ++i)
    {
        if(hash[s[i]] == 0)
            tmp.push_back(s[i]);
    }
    s = tmp;

    cout << s << endl;
}

总结

优化查找效率,空间换时间:哈希映射。



除2倒取余:

如:255=(11111111)B

255/2=127=====余1

127/2=63======余1

63/2=31=======余1

31/2=15=======余1

15/2=7========余1

7/2=3=========余1

3/2=1=========余1

1/2=0=========余1

789=1100010101(B)

789/2=394 余1 第10位

394/2=197 余0 第9位

197/2=98 余1 第8位

98/2=49 余0 第7位

49/2=24 余1 第6位

24/2=12 余0 第5位

12/2=6 余0 第4位

6/2=3 余0 第3位

3/2=1 余1 第2位

1/2=0 余1 第1位

指针的运算

*指针变量的类型,决定了它指向的空间内的数据类型。如int* p,指向的空间存放的就是int。

*所谓“指向”,也就是指针变量内存了目标的地址,解引用就是通过指针变量内的地址找到目标。

  • 指针 +/- 常数:跳过常数个指针指向空间的数据类型,如int*p += 1,就是跳过一个int
  • 指针 +/- 指针:计算指针之间的元素个数(对int* p一个元素就是一个int)

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

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

相关文章

大数据分析案例-基于多元线性回归算法构建广告投放收益模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

走好这三步,不再掉进云上安全的沟里!

序言一直以来&#xff0c;公有云安全是横亘在广大用户面前的一道鸿沟。云安全&#xff08;Cloud Security&#xff09;是指用于控制云计算的安全性、合规性和其他使用风险的过程、机制和服务。公有云提供商们都强调安全是其最高优先级工作&#xff0c;动辄就发布上百页的云上安…

谁还没个技术呢~PYTHON制作观看软件

前言 大家早好、午好、晚好吖 ❤ ~ 以前没钱时&#xff0c;我是这样嘚&#xff1a; 朋友说好一生一起走&#xff0c;账号先借我来耍耍 现在没钱时&#xff0c;我是这样嘚&#xff1a; 涨价就涨价&#xff0c;怎么还搞搞限制账号登录这一出呢~ 这年头~谁还没点技术不是,看我…

复盘一下slam中常用的几种点云类型

使用livox雷达常涉及至少3种点云格式&#xff0c;一个是livox官方定义的custom格式&#xff0c;另外两个就是激光、视觉常用的pcl类型和ros类型。之前总结过Livox雷达驱动程序发布点云格式CustomMsg和pcl::PointXYZI、pcl::PointXYZINormal之间的关系&#xff0c;现在再来复盘一…

【TypeScript】TS进阶-泛型(八)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff1a;vue3从入门到…

【Linux】工具使用

文章目录一、Linux 软件包管理器 yum二、 Linux开发工具&#xff08;1&#xff09; Linux编辑器-vim使用&#xff08;2&#xff09;简单vim配置三、Linux编译器-gcc/g使用四、动态库和静态库五、Linux调试器-gdb使用六、Linux项目自动化构建工具-make/Makefile(1)make/Makefile…

如何才能精通 Redis?

为什么我要讲 Redis&#xff1f; 已经出过这么多主题的书籍和课程了&#xff0c;这次我为什么要选择 Redis 这个主题呢&#xff1f; 那自然是因为 Redis 是我们实际开发中不可或缺的组件之一&#xff0c;也是目前全球最流行的 KV 数据库。相信小伙伴们在工作中也会频繁接触到…

【入门篇】2 # 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

说明 【数据结构与算法之美】专栏学习笔记。 为什么引入这些时间复杂度 先看下面代码 // n 表示数组 array 的长度 int find(int[] array, int n, int x) {int i 0;int pos -1;for (; i < n; i) {if (array[i] x) {pos i;break;}}return pos; }上面代码中如果没有 …

Redis序列化和java存入Redis数据序列化反序列化总结

背景&#xff1a; 最近考虑java代码数据在保存redis时&#xff0c;通常要配置序列化&#xff0c;才能保存到redis中&#xff0c;然而我们知道Redis中也有序列化&#xff08;RDB和AoF两种形式&#xff09;&#xff0c;有点混淆总结一下。 java中数据保存redis过程序列化的原因是…

图解:什么是二叉查找树?

文章目录1. 二叉查找树的概念2. 二叉查找树的实现&#x1f351; 定义节点&#x1f351; 函数接口总览&#x1f351; 构造函数&#x1f351; 拷贝构造&#x1f351; 赋值重载&#x1f351; 析构函数&#x1f351; 查找操作&#x1f345; 动图演示&#x1f345; 非递归实现&#…

【机器学习】线性回归(实战)

线性回归&#xff08;实战&#xff09; 目录一、准备工作&#xff08;设置 jupyter notebook 中的字体大小样式等&#xff09;二、构建实验所需的数据&#xff08;以下实验将基于此数据&#xff09;三、实现线性回归的两种方式方法一&#xff1a;通过直接求解得到拟合方程参数&…

Python金融风控模型案例实战大全

大家好&#xff0c;我是Toby老师&#xff0c;今天介绍 《Python金融风控模型案例实战大全》。 1.《Python金融风控模型案例实战大全》程覆盖多个核心知识点&#xff0c;包括风控建模全流程知识介绍&#xff0c;信用评分卡&#xff0c;信用评分卡知识包含个人信用评分卡和企业信…

ifconfig-显示和配置网络

ifconfig是linux中用于显示或配置网络设备&#xff08;网络接口卡&#xff09;的命令&#xff0c;英文全称是network interfaces configuring。配置网卡的IP地址语法例&#xff1a;ifconfig eth0 192.168.0.1 netmask 255.255.255.0 系统命令 语法 ifconfig [网络设备][down up…

读Go语言精进之路

主要是摘取书中&#xff0c;个人感觉比较重要的内容。 文章目录第一部分 熟知Go的一切理解Go的设计哲学使用Go语言原生编程思维写Go代码第二部分 项目结构、代码风格和标识符命名第三部分 声明、类型、语句与控制结构13 了解切片的底层原理14 了解Map实现原理并高效使用15. str…

Word处理控件Aspose.Words功能演示:在 C# .NET 中将 DOC/DOCX 转换为 PNG

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

Linux系统中常见的压缩命令和特殊权限说明

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

PHP多进程(二)之pcntl_wait

上篇文章我们说到父进程应该回收子进程结束之后产生的数据,这样才会不浪费系统资源。 一个程序启动之后&#xff0c;变成了一个进程&#xff0c;进程在以下情况会退出 1&#xff09;运行到最后一行语句 2) 运行时遇到return 时 3) 运行时遇到exit()函数的时候 4) 程序异常的时…

docker搭建maven私服(nexus3),整合springboot上传下载依赖

一、前言 我们在JavaWeb开发中必不可少的就是jar包管理-maven&#xff0c;在没有maven之前&#xff0c;都是自己手动下载jar包导入到项目中&#xff0c;非常的繁琐。 maven出现之后&#xff0c;又迎来新的问题&#xff0c;对于仓库里人家发布的都可以引用下载&#xff0c;但是…

音视频面试基础题

编码原理 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?核心思想就是去除冗余信息&#xff1a; 1&#xff09;空间冗余&#xff1a;图像相邻像素之间有较强的相关性 2&#xff09;时间冗余&#xff1a;视频序列的相邻图像之间内容相似 3&#xff09…

CVPR21 - BasicVSR:简单有效的视频超分辨率Baseline

文章目录原文信息初识相知组件分析BasicVSRIconVSR部分实验回顾原文信息 原文链接 初识 相比于图像超分&#xff0c;视频超分(VSR&#xff0c;Video Super-Resolution)显然是一件更具挑战性的任务。视频超分比图像超分多了时间维度的信息、更为复杂&#xff0c;而在当时&…