网站内移动的图片怎么做的电影资源分享网站怎么做的

总言
  主要内容:一些习题。
   
   
文章目录
- 总言
 - 一、选择
 - 1、for循环、操作符(逗号表达式)
 - 2、格式化输出(转换说明符)
 - 3、for循环、操作符(逗号表达式、赋值和判等)
 - 4、if语句、操作符(自增自减、判等)
 - 5、表达式求值(类型转换)
 - 6、二维数组(数组初始化)
 - 7、位操作符(按位或与非)
 - 8、位移操作符、位操作符
 - 9、运算符优先级
 - 10、 指针概念理解
 
- 二、编程
 - 2.1、组队竞赛
 - 2.1.1、题目
 - 2.1.2、题解:贪心
 
- 2.2、删除公共字符
 - 2.2.1、题目
 - 2.2.2、题解一:直接遍历查找删除
 - 2.2.3、题解二:借助哈希
 
- Fin、共勉。
 
  
   
一、选择
1、for循环、操作符(逗号表达式)
以下for循环的执行次数是()
for (int x = 0, y = 0; (y = 123) && (x < 4); x++);A 是无限循环
B 循环次数不定
C 4次
D 3次
 
相关知识链接:操作符详解
回答:4次
 

  
   
   
   
2、格式化输出(转换说明符)
以下程序的运行结果是()
#include <stdio.h>
int main(void) {printf("%s , %5.3s\n", "computer", "computer");return 0;
}A computer ,   puter
B computer ,   com
C computer ,   computer
D computer ,   compu.ter
 
回答:computer ,   com
 
  相关说明:
   
 

  
   
   
   
3、for循环、操作符(逗号表达式、赋值和判等)
下列main()函数执行后的结果为()
int func() {int i, j, k = 0;for (i = 0, j = -1; j = 0; i++, j++) {k++;}return k;
}
int main() {cout << (func());return 0;
}A -1
B 0
C 1
D 2
 
相关链接:for循环表达式
回答:i=j=k=0;
 

  
   
   
   
4、if语句、操作符(自增自减、判等)
下面程序输出是什么?
#include <stdio.h>
int main()
{int a = 1, b = 2, c = 3, d = 0;if (a == 1 && b++ == 2)if (b != 2 || c-- != 3)printf("%d,%d,%d\n", a, b, c);elseprintf("%d,%d,%d\n", a, b, c);elseprintf("%d,%d,%d\n", a, b, c);return 0;
}A 1,2,3
B 1,3,2
C 3,2,1
D 1,3,3
 
  考察:
   ①if语句中,else匹配原则:相关链接。
   ②逻辑运算符中的短路现象:相关链接。
回答:a=1 b=3 c=3(短路) d=0
 

  
   
   
   
5、表达式求值(类型转换)
  若有定义语句: int a=10 ; double b=3.14 ; 则表达式 'A'+a+b 值的类型是()
A char
B int
C double
D float
 
考察了隐式类型转换(整型提升、算术转换):相关链接
回答:C以下为寻常算术转换:(自下向上转换)
long double
double
float
unsigned long int
long int
unsigned int
int
 
  
   
   
   
6、二维数组(数组初始化)
下述p[1][2]的值是()
int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};A 1
B 0
C 6
D 2
 
考察了二维数组的创建与初始化:相关链接。
回答:0。四行四列,行可以省略时花括号区分,值不够时默认为0。
 

  
   
   
   
7、位操作符(按位或与非)
  选择表达式 11|10 的结果(本题数值均为十进制)()
A 11
B 10
C 8
D 2
 
相关链接。
回答:11。
 
  
   
   
   
8、位移操作符、位操作符
fun(21)运行结果是()
int fun(int a) {a ^= (1 << 5) - 1;return a;
}A 10
B 5
C 3
D 8
 
相关链接。
回答:10。
 
  
   
   
   
9、运算符优先级
  如下述定义语句,不能使变量 year 中的值增至 1010 的语句是()
int year=1009,*p=&year;A *p+=1;
B (*p)++;
C ++(*p);
D *p++;
 
主要考察前置自增、后置自增、解引用操作符优先级相关链接。
回答:D。
 

  
   
   
   
10、 指针概念理解
下面关于"指针"的描述不正确的是()
A 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B 32位系统下任何类型指针的长度都是4个字节
C 指针的数据类型声明的是指针实际指向内容的数据类型
D 野指针是指向未分配或者已经释放的内存地址
 
A
 
  解释:实际上,使用 free() 函数释放一个指针所指向的内存时,指针本身的值并不会被自动置为 NULL。free() 只负责释放内存,而不会修改指针的值。 因此,指针仍然会指向之前分配的内存地址,但这个地址现在可能已经被操作系统用于其他目的,所以访问这个地址可能会导致未定义行为,比如程序崩溃。为了避免这种情况,一种常见的做法是在调用 free() 之后手动将指针设置为 NULL。
   
   
   
   
   
二、编程
2.1、组队竞赛
2.1.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。
  
   
   
   
2.1.2、题解:贪心
说明: ①既然涉及到取较大值,先将输入的数据排序处理;②其次,让每次选值尽量取当前最大两值(由于最大的数不可能是中位数,所以退而求其次,取每组中第二大的);③这样,最终获取到的所有组中的水平值总和最大。
举例:
1 2 3 4 5 6 7 8 9组1: 1 8 9 -->8;
组2: 2 6 7 -->6;
组3: 3 4 5 -->4;
中位数和:8、6、4.(当前最大)下标关系:arr[arr.length-2*(i+1)]
arr.length=9;
i=0时,arr[7]=8;
i=1时,arr[5]=6;
i=2时,arr[3]=4;
i根据n值而定。
 
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {//1、输入数据long long n;//n个队伍while (cin >> n) //OJ题,可能存在多组测试用例{ vector<int> arr(3 * n);//3*n个选手for (int i = 0; i < 3 * n; ++i){cin >> arr[i];}//2、排序std::sort(arr.begin(), arr.end());//3、找每组水平值long long sum = 0;//用于统计最后水平值总和。for (int i = 0; i < n; ++i) {sum += arr[arr.size() - (2 * (i + 1))];}cout << sum << endl;}return 0;
}
 
  
   
   
   
   
2.2、删除公共字符
2.2.1、题目
  题源:链接
 
   
   
   
   
2.2.2、题解一:直接遍历查找删除
  说明: 如下,根据s2中给定查找的字符串,遍历一遍s1,将满足s2中的字符删除。时间复杂度为 O ( M ∗ N 2 ) O(M*N^2) O(M∗N2) [ 遍历s1(n),erase挪位删除(n),遍历s2(m)。]
   其它: 熟悉string类接口的使用。
#include <iostream>
#include <string>
using namespace std;int main()
{string s1, s2;getline(cin, s1);getline(cin, s2);int pos = 0;for (size_t i = 0; i < s2.size(); ++i){while ((pos = s1.find(s2[i])) != string::npos){s1.erase(pos, 1);}}cout << s1 << endl;return 0;
}
 
  
   
   
2.2.3、题解二:借助哈希
说明:字符串一共256个,可以建立一个char类型的长度固定的数组来做哈希映射,该数组用来统计s2字符串中出现的字母的个数。遍历s1与该哈希数组比较,该数组中存在的值说明在s2中出现过。
#include <iostream>
#include <string>
using namespace std;int main()
{string s1,s2;getline(cin,s1);getline(cin,s2);string ret;int hash[256] = {0};//使用哈希映射思想先统计s2中各字符出现的次数for(size_t i = 0; i < s2.size(); ++i){hash[s2[i]]++;}for(size_t i = 0; i < s1.size(); ++i){if(hash[s1[i]] == 0)ret += s1[i];}cout << ret << endl;return 0;
}
 
  
   
   
   
   
   
   
Fin、共勉。

