前言
小编依稀记得,第一次接触算法是在高中的时候,用尺子规范的在作业本上画流程图,不同的形状对应不同的流程,什么椭圆开始与结束,还有各种代表条件、判断的四边形图。
而且,小编现在编程的时候依旧有这样的习惯,在某个业务块需要用到某些算法的时候,我都会先在纸上画出完整的流程图,把所有的可能性标出来,然后进行步骤缩减,给出最优解。
建议一些写代码写得比较复杂的朋友可以先试试这样的方式,尤其是在有算法需求的代码上。
算法的重要性
有些朋友认为编程最重要的运用工具,运用框架,多掌握一些技术点,这些确实是成为大家职业瓶颈的重要因素。但是,真正决定你能否成为大神的是——算法。
跟学生时代一样,那些数学成绩好的人,往往就是同学眼里的学霸。
算法通常需要程序员有较强的逻辑思维能力,所以你会发现,很多大神写出的代码都是非常工整且简洁的。
程序员小陈就很不巧遇到一件跟算法有关的事情,公司突然组织考察算法,结果10道题8道答错。被老板叫到办公室,进行了长达三个小时的深度聊天。第二天,程序员小陈就主动离职了,一直在家刷算法题,据说是从高中数学开始看起的。
这里来两个腾讯的算法题吧:
1、小 Q 定义了一种数列称为翻转数列:
给定整数 n 和 m, 满足 n 能被 2m 整除。对于一串连续递增整数数列1, 2, 3, 4...,每隔 m 个符号翻转一次,最初符号为'-';。
例如n=8,m=2,数列就是:-1, -2, +3, +4, -5, -6, +7, +8。
而n=4,m=1,数列就是:-1, +2, -3, + 4。
小Q现在希望你能帮他算算前 n 项和为多少。
解析:
输入描述:
输入包括两个整数 n 和 m(2 <= n <= 109, 1 <= m), 并且满足 n 能被 2m 整除。
输出描述:
输出一个整数, 表示前 n 项和。
输入例子 1:
8 2
输出例子 1:
8
答案:
解题思路:一个数列共有 n/2m 组,每一组的和为 m^2 所以,前 n 项和为:(n/2m)*(m^2)=m*n/2
using namespace std; typedef long long LL; int main() { LL n, m; cin >> n >> m; cout<<n*m/2<<endl; }
2、牛牛和羊羊正在玩一个纸牌游戏。这个游戏一共有 n 张纸牌, 第 i 张纸牌上写着数字 ai。
牛牛和羊羊轮流抽牌,牛牛先抽,每次抽牌他们可以从纸牌堆中任意选择一张抽出,直到纸牌被抽完。
他们的得分等于他们抽到的纸牌数字总和。
现在假设牛牛和羊羊都采用最优策略,请你计算出游戏结束后牛牛得分减去羊羊得分等于多少。
解析:
输入描述:
输入包括两行。 第一行包括一个正整数 n(1 <= n <= 105),表示纸牌的数量。 第二行包括 n 个正整数 ai(1 <= ai <= 109),表示每张纸牌上的数字。
输出描述:
输出一个整数,表示游戏结束后牛牛得分减去羊羊得分等于多少。
输入:
3 2 7 4
输出:
5
答案:
# coding=utf-8 while 1: num=int(raw_input()) l=sorted(map(int,raw_input().split())) tar=num%2 sumA=0 sumB=0 fori inrange(num): ifi%2==tar: sumA+=l[i] elifi%2!=tar: sumB+=l[i] printabs(sumA-sumB) break
算法
二分查找
冒泡排序算法
插入排序算法
快速排序算法
希尔排序算法
归并排序算法
桶排序算法
基数排序算法
剪枝算法
回溯算法
最短路径算法
最大子数组算法
最长公共子序算法
最小生成树算法
以上资料:算法学习内容、算法与数据结构脑图、面试题含答案,我都已经打包好了,有需要的小伙伴私信我【111】,即可获取~