笔试强训day35

1.奇数位丢失

描述

对于一个由 0…n 的所有数按升序组成的序列,我们要进行一些筛选,每次我们丢弃去当前所有数字中第奇数位个的数。重复这一过程直到最后剩下一个数。请求出最后剩下的数字。

数据范围: 1≤n≤1000 1≤n≤1000 ,本题有多组输入

输入描述:

每组数据一行一个数字,为题目中的n(n小于等于1000)。

输出描述:

一行输出最后剩下的数字。

方法一、 非常没有技术含量的使用队列来模拟这个过程

#include <iostream>
#include <queue>

using namespace std;
int n;
queue<int>q;

int main()
{
	cin >> n;
	for (int i = 0; i <= n; ++i)q.push(i);
	int sz = n + 1;
	while (sz != 1)
	{
		for (int i = 1; i <= sz; ++i)
		{
			if (i % 2==0)q.push(q.front());
			q.pop();
		}
		sz = sz / 2;
	}
	cout << q.front() << endl;
	return 0;
}

方法二、

#include <iostream>

using namespace std;
int n;

int main()
{
	while (cin >> n)
	{
		int ret = 1;
		while (ret - 1 <= n)ret <<= 1;
		cout << ret / 2 - 1 << endl;
	}

	return 0;
}

2.求和

输入两个整数 n 和 m,从数列1,2,3…n 中随意取几个数,使其和等于 m,要求将其中所有的可能组合列出来。

输入描述:
输入两个正整数,n和m。
其中n,m均不大于10
输出描述:
按每个组合的字典序排列输出,每行输出一种组合。

比较常规的思路,考虑每个位置选或者不选,同时可以加一个剪枝

#include <iostream>
#include <vector>

using namespace std;
int n, k;

void dfs(vector<int>& result, const vector<int>& v,int u,int sum)
{
	if(u == n+1)
	{
		if (sum == k)
		{
			for (auto& x : result)
				cout << x << ' ';
			cout << '\n';
			return;
		}
	}
	else if (sum > k)return;
	else {
		result.push_back(v[u]);
		dfs(result, v, u + 1, sum + v[u]);//选
		result.pop_back();

		dfs(result, v, u + 1, sum);//不选
	}
}
int main()
{
	cin >> n >> k;
	vector<int>v(n + 1);
	for (int i = 0; i <= n; ++i)v[i] = i;
	vector<int>result;
	dfs(result, v,1,0);

	return 0;
}

3.计算字符串的编辑距离

描述

Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家 Levenshtein 提出的,故又叫 Levenshtein Distance 。

例如:

字符串A: abcdefg

字符串B: abcdef

通过增加或是删掉字符 ”g” 的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。

要求:

给定任意两个字符串,写出一个算法计算它们的编辑距离。

数据范围:给定的字符串长度满足 1≤len(str)≤1000 1≤len(str)≤1000

输入描述:

每组用例一共2行,为输入的两个字符串

输出描述:

每组用例输出一行,代表字符串的距离

#include <iostream>
#include <string>

using namespace std;
string a, b;
const int N = 1010;
int dp[N][N];//dp[i][j]表示的是a中[1,i]区间以及b中[1,j]区间内的编辑距离
/*
状态转移方程:
        a[i] == b[j] dp[i][j] = dp[i-1][j-1]
dp[i][j]                                删         增       换
        a[i] != b[j] dp[i][j] = min({dp[i-1][j],dp[i][j-1],dp[i-1][j-1]})+1
*/
int main()
{
    cin >> a >> b;
    int n = a.size(), m = b.size();
    for (int i = 0; i <= n; ++i)
    {
        dp[i][0] = i;
    }
    for (int j = 0; j <= m; ++j)
    {
        dp[0][j] = j;
    }
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= m; ++j)
        {
            if (a[i - 1] == b[i - 1])
                dp[i][j] = dp[i - 1][j - 1];
            else
                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
        }
    }
    cout << dp[n][m] << endl;
    return 0;
}
<think>嗯,用户之前已经得到了一个四周的学习计划,现在他们提到有周六周日两天假期,每天有6到8小时的空闲时间,想要进一步缩短学习时间。这说明用户可能时间紧迫,比如春招临近,需要尽快掌握C++的笔试面试内容。用户之前的情况是会C语言,现在转学C++,所以需要利用已有的C基础来加速学习。 首先,我需要确定用户的主要需求是缩短总学习时长,同时保持学习效果,特别是针对笔试和面试的核心考点。用户可能希望在更短的时间内集中突破重点,而不是按部就班地学习所有内容。因此,需要调整原有的四周计划,压缩到更短的时间,比如两天的高度学习,但需要确保覆盖最关键的知识点。 接下来,分析用户的时间安排。两天每天6到8小时,总共有12到16小时的学习时间。原有的计划分为四周,每天两小时,共56小时。现在要在两天内完成,时间大大缩短,所以必须精选最高频和重要的内容,舍弃次要部分。 考虑到C++面试和笔试的重点通常包括:类和对象、继承与多态(尤其是虚函数表)、STL容器(如vector、map)、智能指针、以及现代C++特性如移动语义和右值引用。此外,内存管理和模板基础也是常见考点。需要将这些内容浓缩到两天内,同时结合实战练习,如LeetCode题目和模拟面试题。 可能的挑战是如何在有限的时间内高效覆盖这些内容,并且确保用户能够理解关键概念,而不仅仅是表面知识。需要设计一个紧凑的学习计划,每个时间段专注于一个主题,结合理论学习和动手实践,例如通过代码示例和即时练习来巩固知识点。 另外,用户已经会C语言,可以利用这一点加速理解C++的特性。例如,对比C的结构体和C++的类,C的函数指针和C++的虚函数等。这样可以减少学习时间,因为用户已经有相关的基础。 需要注意,两天的高度学习可能会让用户感到压力,因此学习计划需要合理分配时间,避免信息过载。每个学习模块应控制在1到2小时内,中间穿插练习和休息,保持学习效率。 最后,要确保用户能够在短时间内掌握足够应对笔试面试的知识,可能需要重点放在高频考点和常见面试题上,例如手写智能指针、虚函数表原理、STL容器的使用及底层实现等。同时,提供实战练习和错题复盘,帮助用户巩固所学内容,并在模拟面试中应用这些知识。</think>针对周末两天突击学习(每天6-8小时,总时长12-16小时),我为你设计**超浓缩实战方案**,聚焦笔试面试最高频核心考点,利用C语言基础快速突破: --- ### **Day 1:核心概念突破(8小时)** **🔥 上午(4小时)—— 生死时速班** 1. **类与对象速成(1.5h)** - 手撕代码:对比C结构体实现类(重点构造/析构函数) - 虚函数表手绘练(必须掌握!) - 多态实现:用C的函数指针模拟虚函数(理解底层) 2. **STL核武器(2h)** - vector底层扩容机制(笔试必考) - map/unordered_map红黑树与哈希实现差异 - 迭代器失效场景速记(附典型笔试题) 3. **智能指针生死战(0.5h)** - unique_ptr vs shared_ptr内存模型手绘 - 循环引用问题(weak_ptr急救包) **💻 下午(4小时)—— 代码实战营** ```markdown 14:00-15:30 高频题冲刺: - LeetCode 155(最小栈,考察类设计) - 手写vector核心接口(push_back/reserve) - 实现线程安全的单例模式(双重锁校验) 15:30-17:00 底层原理突破: - 用gdb查看虚函数表内存布局 - 通过汇编代码分析多态调用过程 - 对比malloc与new的内存分配差异 ``` --- ### **Day 2:面试直通车(8小时)** **💡 上午(4小时)—— 考点轰炸机** 1. **现代C++闪电战(2h)** - 移动语义:对比深浅拷贝手写String类 - 完美转发实战(std::forward应用场景) - constexpr编译期计算(面试加分项) 2. **模板元编程急救(1h)** - 手写泛型栈模板类(重点模板特化) - type_traits实战(enable_if技巧) 3. **内存管理死记硬背(1h)** - new/delete重载实现内存池(笔试高频) - 内存对齐规则速记(#pragma pack原理) **🚀 下午(4小时)—— 全真模拟战** ```markdown 14:00-16:00 真题绞杀: - 牛客网《C++工程师必考20题》限时刷 - 剑指Offer 07/35/36(树与链表专题) - 大厂高频题:对象池设计/环形缓冲区实现 16:00-18:00 面试模拟: - 白板编程:手写智能指针(面试官最爱) - 口述考点:STL线程安全问题(附标准答案模板) - 压力测试:虚函数表10连问攻防演练 ``` --- ### **生存指南** 1. **保命技巧**: - 遇到陌生概念时,立即用C语言实现类比(如用结构体+函数指针模拟类) - 所有代码示例必须手写三遍(类定义/智能指针/容器操作) 2. **急救包资源**: - 牛客网《C++面试急救手册》(高频考点汇总) - GitHub仓库:Cpp-Shortcut(精选代码模板) 3. **重点雷区**: ```c++ // 必须避免的死亡陷阱 vector<int> v; for(auto it=v.begin(); it!=v.end(); ){ if(*it == 1) v.erase(it++); // 迭代器失效! else ++it; } ``` 通过这个方案,你将能在两天内快速掌握80%以上的笔试面试高频考点。建议最后2小时重点复盘错题,并使用CLion调试器动态观察对象内存变化(这对理解虚函数机制有奇效)!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值