算法题常用技巧C++

刷题常用技巧C++

常用头文件

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 

#include<bits/stdc++.h>
这个是万能头文件,但是部分编译器不支持,个人建议还是不要依赖它,它还会延长你的编译时间。

短除法

数学意义上的短除法运算方法是先用一个除数除以能被它除尽的一个质数,以此类推,除到商是质数为止

在这里插入图片描述

常用于求最大公约数和最小公倍数

int MaxComDiv(int a,int b)//大的值为b 
{
    for(int i=a;i>=1;i--)   //两个数互质时,最大公约数为1
        if(a%i==0 && b%i==0)        
            return i;   
} 

最小公倍数 = a*b /最大公约数


int MinComMulti(int a,int b)
{
    return a*b/MaxComDiv(a,b);
}  

递归辗转除法也可以用于上述问题

int MaxComDiv(int a,int b)//a,b大小关系不定 
{ 
    if(a==0) 
    	return b;
    return MaxComDiv(b%a,a);
}

数组

定义动态数组(根据键盘输入的值来创建数组)

int n;
cin>>n;
int *a=new int[n];

计算数组中元素个数的三种方法
①使用库函数strlen()

len = strlen(str); 

②使用while循环

int i=0;
while(a[i++]!='\0');

③使用函数sizeof()

len = sizeof(a)/sizeof(a[0]); 

但是并不能直接计算一个数组中输入的数据的个数,因为没有输入数据的单元会被赋值为0(相当于我们手动输入了0进去,所以上面的方法不能直接得出我们真正输入的数据的个数),可以考虑使用队列Q,因为队列用多少就申请多少空间,Q.size()函数可以计算出当前输入的数据的个数。

队列

声明一个队列以及队列中常用的一些函数

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

int main()
{ 
	int i;
       queue <int> myQ; 
       for(i=0; i<10; i++) 
              myQ.push(i);
       cout<<"myQ size is: "<<myQ.size()<<endl;
       for(i=0; i<myQ.size(); i++) 
       { 
              cout << myQ.front()<<endl; 
              myQ.pop(); 
       } 
       cout<<"myQ size is: "<<myQ.size()<<endl;
	   cout<<"myQ last is: "<<myQ.back()<<endl;
       return 0;
}

常用的关于队列的函数的解析

使用EXCEL表格取巧求值

有的题目给出一些很麻烦且繁多的数据,不方便利用代码求解时,我们可以直接利用Excel里面自带的函数直接进行计算,非常方便。

如下图所示

①给定两列初始数据,求他们的乘积
在这里插入图片描述
②先点击一个单元格,用来输出计算的结果(如上:C1单元格)点击左上角的插入函数
在这里插入图片描述
可以在搜索函数中输入公式的描述,点击转到,会直接给出相近描述的公式,这里我们要用到PRODUCT函数,计算所有参数的乘积。如果不知道怎么描述,也可以自己对照下面给出的中文释义找合适的函数,就是很麻烦
在这里插入图片描述
当然也可以直接在后面的单元格中直接输入 = A1 * B1,再按回车,就可以得出结果了,但是这需要我们很熟悉这个函数在excel里面的公式,有的公式我们也不知道excel里面是怎么定义的
在这里插入图片描述

③A1:B1是从单元格A1到单元格B1中间所有的单元格数据(包括A1,B1)按照该函数进行计算
在这里插入图片描述
④点击确定,然后就可以得出结果了
在这里插入图片描述
⑤长按C1单元格往下拉,就可以将剩下的行数据按照第一行的函数计算出来了
在这里插入图片描述
⑥使用“自动求和”域名中的函数进行计算
在这里插入图片描述
先选中需要计算的单元格,然后点击相应的函数即可求值
(1)求之前的结果的总和
在这里插入图片描述
(2)求之前的结果的最大值
在这里插入图片描述

文件的读写

有一些题目,它会给一个存储了许多数据的文本文件,让我们去读取它,亦或者我们自己需要利用文件读写去方便的输入数据进行测验,这时就需要利用文件读写方面的函数了。
程序所用的数据可以从磁盘文件读取(称为读文件),程序运行的结果可以存到磁盘文件(称为写文件)。

①从键盘文件读取数据,写到磁盘文件
#include <iostream>
using namespace std;

void main()
{
	FILE *fp;				  //定义文件指针
	char ch;
	fp=fopen("11.txt","w");   //以“写”的方式打开工程目录下的文件,如果没有该文件,则系统会自动创建
	if(!fp)				       //判断文件是否可以打开,注意:文件是否能打开的前提是文件已经存在,只要不出现下面的提示信息,就说明文件已经存在于工程目录之中
	{
		cout<<"File could not be opened !";
		exit(1);
	}	
	cout<<"input a text (to end with'#')"<<endl;//输入提示,输入一段文本(以#结束)
	ch = getchar();			  //读入第一个字符
	while(ch!='#')
	{
		fputc(ch,fp);
		ch = getchar();		  //继续读入下一个字符
	}
	fclose(fp);   //关闭文件
}

在这里插入图片描述
在这里插入图片描述
还要注意的一点是:如果原来的文件中已经有了数据,则我们这次输入的数据会覆盖掉之前的数据。

②从磁盘文件读取数据,写到显示器
#include <iostream>
using namespace std;

void main()
{
	FILE *fp;				  //定义文件指针
	char ch;
	fp=fopen("11.txt","r");   //以“读”的方式打开工程目录下的文件
	if(!fp)				       //判断文件是否可以打开,注意:文件是否能打开的前提是文件已经存在,只要不出现下面的提示信息,就说明文件已经存在于工程目录之中
	{
		cout<<"File could not be opened !";
		exit(1);
	}	
	ch = fgetc(fp);			  //先从文件中读取第一个字符
	while(! feof(fp))
	{
		putchar(ch);		  //输出该字符
		ch = fgetc(fp);		  //继续从文件中读取下一个字符
	}
	fclose(fp);   //关闭文件
}

在这里插入图片描述

暂时先写这些吧,以后再更,大家加油呀!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C算法实战面试可以是各种类型和难度的问,从简单的数组操作到复杂的图算法。下面是一个可能的目: 假设有一个数组num,其中包含了一些整数。请编写一个算法,找到数组中两个元素的和等于给定的目标数的索引,并返回这两个元素的索引。 解思路如下: 1. 创建一个空的字典,用来存储已经遍历过的元素的值和对应的索引。 2. 遍历整个数组num,对于每个元素num[i],检查目标数与当前元素之差是否已经存在于字典中。 3. 如果存在,说明之前已经遍历过一个元素num[j],使得num[i] + num[j] = 目标数。返回j和i作为结果。 4. 如果不存在,说明之前没有找到与当前元素相加等于目标数的元素,将当前元素的值和索引添加到字典中,继续遍历数组。 5. 如果遍历结束后没有找到满足条件的元素,返回一个空的结果。 这个算法的时间复杂度是O(n),其中n是数组num的长度。因为只需要遍历一次数组,并且利用字典的查找操作是常数时间的。 在实际的面试中,可以进一步要求优化算法,例如考虑数组中可能存在重复元素的情况,或者要求返回所有的满足条件的索引对等。根据具体情况,可以对算法进行细化和改进。 ### 回答2: c 算法实战面试是指在面试过程中,针对 C 语言编程能力要求的一系列算法目。这类目旨在考察面试者对基本算法和数据结构的理解和掌握程度,以及解决实际问的能力和思维方式。 常见的 C 算法实战面试包括排序算法(如冒泡排序、插入排序、快速排序等)、查找算法(如二分查找、哈希查找等)、字符串处理问(如字符串反转、字符串匹配等)、链表相关问(如链表反转、链表中的环检测等)、递归和迭代等等。 在面试中回答此类问,需要从具体算法和解思路两个方面进行回答。 对于具体算法,需要清晰地解释算法原理和实现步骤,算法的时间和空间复杂度等。例如,对于快速排序算法,可以解释其基本思想是通过选择一个基准元素,并将待排序数组分为两部分,一部分小于等于基准元素,一部分大于基准元素,然后递归地对两部分进行排序,最终达到整个数组有序的目的。 对于解思路,可以从多个角度进行分析和讨论。例如,在链表环检测问中,除了传统的使用哈希表或快慢指针的方法之外,还可以考虑使用递归和迭代的思路来解决。并且需要考虑解决问时可能存在的边界情况和异常情况。 总之,回答 C 算法实战面试需要充分理解算法原理,并能运用一定的思维方式和解技巧,同时也需要注重代码实现的效率和边界情况的处理,以展现自己扎实的编程能力和解决问的能力。 ### 回答3: c算法实战面试是一种在面试中常见的型,需要候选人用C语言编写代码解决给定的问。以下是一个简单的示例目和解答: 目:给定一个整数数组nums和一个目标值target,请找出数组中两个数的和等于目标值,并返回它们的索引。 示例输入:nums = [2, 7, 11, 15], target = 9 示例输出:[0, 1] 解答: ``` #include <stdio.h> int* twoSum(int* nums, int numsSize, int target, int* returnSize) { int i, j; int* result = (int*)malloc(2 * sizeof(int)); for (i = 0; i < numsSize - 1; i++) { for (j = i + 1; j < numsSize; j++) { if (nums[i] + nums[j] == target) { result[0] = i; result[1] = j; *returnSize = 2; return result; } } } *returnSize = 0; return NULL; } int main() { int nums[] = {2, 7, 11, 15}; int target = 9; int returnSize; int* result = twoSum(nums, sizeof(nums) / sizeof(nums[0]), target, &returnSize); if (returnSize == 2) { printf("[%d, %d]\n", result[0], result[1]); } else { printf("No result found.\n"); } free(result); return 0; } ``` 这个示例目要求在给定的数组中找到和为目标值的两个数,并返回它们的索引。在解法中,我们使用了简单的双重循环来遍历数组,找到符合条件的两个数后,保存它们的索引并返回。如果遍历完整个数组没有找到符合条件的数对,则返回NULL。 以上是一个简单的C语言面试示例,实际的目可能会更复杂,但解思路一般都是类似的,即使用适当的算法和数据结构来解决问。在面试中,除了正确的解答,面试官还会关注代码的可读性、性能等方面。因此,在写出代码解答之前,应该先仔细阅读目要求,并在思考清楚解思路后再动手编写代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值