C/C++编程基础算法总结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++编程基础算法总结相关的知识,希望对你有一定的参考价值。
使用王道机试指南的电子书也有几天的时间了,终于看完了第二章《经典入门》,下面就来总结回顾一下最常见的六种算法/问题,为下一步刷题打好坚实基础。
套路是:先概述这种题型,然后总结我学到的和易错点。
************************************题目都是九度OJ上的**********************************************
先提一句!时间复杂度!王道一直在提这一点,必须有根据题目中变量的范围来估算时间复杂度的意识。
一、排序问题
- 基本的冒泡、选择排序自不必说,必须掌握。
- C语言的qsort,C++的sort,我都是第一次知道。。
- sort的两种使用方法,要么重载<运算符,要么自己写cmp函数,总之就是让sort函数知道比较规则是什么。cmp函数的写法,比如降序排列,第一个参数比第二个参数大时返回true就好。
- 1061题,结构体排序,也没啥,还是用sort,可在结构体里面定义重载运算符,即规则定义在里面。也可在外面写cmp函数。注意重载的写法。
- 1185题特殊排序,其实很简单,如果逆向思维的话:先排序,自然最大的就出来了,而且题目没说清删一个还是全删,我刚开始全删了,一直WA,结果根本没那么复杂。。。删一个就行。
- 1023,自己写的代码总是RE,至今未明。但大概知道,比较规则应写的简洁明晰,不要太长更不要跟全局变量什么的扯上关系。。我目前只能这么理解了,说的不对的话欢迎大神给我指出错误
二、日期类问题
- 重要的思想:预处理。解决区间类问题的统一思想:把原区间问题统一到固定起点的区间问题上去
- 1096,第一次接触类编程。可以用struct定义类,类里有一个成员函数,即一个方法。大内存数组定义成全局变量。
- 1043,注意取余运算的应用。
三、Hash
- 适用的类型:某变量范围有限、固定、有特点。1431大范围整数排序、1156根据读书判断潜在朋友、1088拔树 这些问题都适合Hash
四、排版题
两类,一种是简单排版,即几何规律与输出顺序有联系。另一类难一点,没联系,要先排版再输出。1161题Repeater,简直虐心。。关键是找到规律,迭代时候注意分不同情况,不要有冲突
五、查找
- 线性查找:遍历,简单
- 二分查找:先用sort变成有序数组,再查找。复杂度会从n变log。典型条件:while(a<=b)
六、贪心算法
思想很简单,就是总获取最好的。(最符合目标要求的)但是有时候不容易找到合适的贪心策略
- 1433,硕鼠换粮题,抽象成为一个以性价比为贪心标准的问题。即:总是优先买性价比最高的商品,直到金钱花完或者这种物品被买完,那就换性价比次高的,以此类推
- 1434的今年暑假不AC,目标是尽可能多的看到完整的节目,那么贪心的标准是以结束时间最早的节目优先,因为这样总是能节约时间以增大更多的节目机会被看的可能性。1435的迷瘴,1436的修墙的贪心标准比较明显。
贪心算法中,while循环的判断条件要仔细斟酌,明确要输出几个变量,有几个变量作为辅助,初始条件是什么,循环过程中会怎么样变化等等。
七、我的常见错误
- 最坑爹的肯定是scanf()函数,首先它是有返回值哒,返回成功读取变量的个数;传入变量地址虽然很小儿科,但为了不忘记再说一句。。格式控制字符串中的一个空格可以抵消输入中的n个空格,6不6.尤其注意输入字符格式的时候,注意空格属不属于待输入字符之内(排版题)属于的话格式控制字符串中不能加空格;要不要用getchar()吸收。。注意回车符也是需要吸收的,尤其排版题要注意。。。
- 常见WA的原因
- 标志位!标志位!计数器!计数器!是不是没清零!!?!我最爱犯的错误,没有之一。甚至有时莫名其妙的话你就应该想到看看标志位清没清,试着清一下。。。
- 算法是否有错
- 边界数据是否有错
- 是不是多组测试用例你只按一组编的
- 是不是某变量/数组声明位置不对,导致第一次用完之后历史数据没清除,本质跟1一样。所以变量随用随定义。
以上就是一周以来的学习总结。想要进一步强化编程,以上基础必须打牢。
以上是关于C/C++编程基础算法总结的主要内容,如果未能解决你的问题,请参考以下文章