算法学习(十),跳台阶问题、奇偶排序

台阶问题:

问题描述:

一个台阶总共有n级,没一次都可以选择跳1级,或者跳2级。

求总共有多少种跳法,并分析算法的时间复杂度。

分析:

如果只有一阶,f (1)= 1,有两阶,有两种跳法,分两次跳,每次一级,或者是一次跳2级。推广到n阶台阶,(n>2),第一次跳的时候又两种选择,如果是第一次跳一级,那么跳法数目等于f(n-1) ,另外一种是第一次跳2级,此时跳法数组等于f(n-2),所以总的跳法f(n) = f(n-1)+f(n-2)

类似fibonacci数列问题

使用递归的思想,

奇偶调序

题目描述:

输入一个整数数组,调整数组中数字的顺序,使得所有的奇数位于数组的 前半部分,所有的偶数位于后半部分。

分析:

在一个数组中,涉及到前后部分的讨论,可以使用首尾双指针,如果首指针指向一个偶数,尾指针指向一个奇数,将两者互换位置,直到两指针相遇为止。这样 数组中的数字,奇数都在前半部分,偶数在后半部分。

#include <iostream>
using namespace std;

bool inEven(int n)  //判读是否为偶数
{
    return (n&1)== 0;
}

void Reorder(int * data ,int length)
{
    int *begin = data;
    int * end = begin+length-1;
    while(begin < end)
    {
        if(!inEven(*begin))
        {
            begin++;
            continue;
        }
        if(inEven(*end))
        {
            end--;
            continue;
        }
        int temp;
        temp= *begin;
        *begin = *end;
        *end = temp;
    }

}
int main()
{
    int a[5] = {2,5,6,7,9};
    Reorder(a,5);
    int i;
    for(i = 0 ;i<5;i++)
        cout << a[i] << endl;
    return 0;
}

我们也可以将这种方法应用到正负数重排序问题上,使得负数在前半部分,正数在后半部分。

第一个只出现一次的字符

题目描述:

在一个字符串中找到第一个只出现一次的字符,如“abcbe”,输出“a”。

分析:

可以使用伴随数组的方法,将字符作为下标,将出现的次数为对应的值,找到第一个值为1,对应的字符。

#include <iostream>
using namespace std;
const int SIZE = 100;
char odd_even_swap(char * str)
{
    char * p;
    int index ;
    int data[SIZE] = {0};
    if(str == NULL)
        return ‘\0‘;
    p = str;
    while( *p != ‘\0‘)
    {
        index = *p++-‘a‘;
        data[index]++;
    }
    int i;
    char result;
    for(i = 0;i<SIZE;i++)
    {
        if(data[i] ==1)
            return i+‘a‘;

    }
}
int main()
{
    char str[10] = "abcade";
    cout << odd_even_swap(str) << endl;
    return 0;
}

当然了,我们也可以将字符直接作为数组下标,不过要注意数组的大小,避免越界。

char odd_even_swap2(char * str)
{
    char *p;
    const int size = 200;   //‘a‘的ascii值为97,所以注意不要越界。
    int tablesize[size] = {0};
    p = str;
    while(*p != ‘\0‘)
    {
        tablesize[*(p++)]++;
    }
    while(*str++ != ‘\0‘)
    {
        if(tablesize[*str] == 1)
            return *str;
    }
    return ‘\0‘;
}
时间: 2024-08-08 08:30:17

算法学习(十),跳台阶问题、奇偶排序的相关文章

算法学习(二):O(n^2)排序算法

总结一下学习的复杂度为O(n^2)的三种排序算法:选择排序,插入排序,希尔排序. (1)选择排序:从第一个位置开始每次查找剩下的位置中最小的数值放入当前位置: (2)插入排序:从第二个位置开始,每次都将当前位置的数值插入前面合适的位置,对于几乎有序的数列来说,插入排序能带来更高的效率: (3)希尔排序:变步长区间的插入排序,指定一个步长衰减率,每一轮插入排序都将间隔指定步长的数值排序完成,当步长衰减为1时,就成了标准的插入排序. 代码实现: (1)选择排序 var selectSort = fu

数据结构和算法学习六,之非递归排序

http://blog.csdn.net/feixiaoxing/article/details/6844826 在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大.作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定.这中间的差别是非常明显的.既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结. 按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的方法对数据进行排序,也就是说主

JavaScript算法系列之-----------------跳台阶(JS实现)

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 思路: (1)跳一级台阶 : 1             一种 (2)跳二级台阶 : 11/2        两种 (3)跳三级台阶 : 先跳一级还有两级台阶同情况(2)  记作=>    1 (2) 先跳两级还有一级台阶同情况(1)  记作=>    2 (1) 把这两种情况加起来就是跳三级台阶的一共可能 (2)+(1) (4)跳四级台阶 : 先跳一级还有三级台阶

经典算法题每日演练——第二十二题 奇偶排序

原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个“奇偶排序”说起吧,不过这个排序还是蛮有意思的,严格来说复杂度是O(N2),不过在多核的情况下,可以做到 N2 /(m/2)的效率,这里的m就是待排序的个数,当m=100,复杂度为N2 /50,还行把,比冒泡要好点,因为重点是解决问题的奇思妙想. 下面我们看看这个算法是怎么描述的,既然是奇偶,肯定跟位数有

数据结构与算法系列十(排序算法概述)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?

算法学习01:二分查询,选择法、插入法、分治法排序

查询与排序是使用的再频繁不过的两个功能,算法学习系列实现语言为C#. 一般情况下的查询 Int32 Search(Int32[] source, Int32 task) { var index = 0; while (index < source.Length) if (source[index++] == task) return index - 1; //返回值为Length则说明未找到 return source.Length; } 时间复杂度为O(n),在检索源没有排序的情况下,这即为最

八大排序算法学习笔记:冒泡排序

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 算法原理: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有

奇偶排序算法

奇偶排序,或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算.这是与冒泡排序特点类似的一种比较排序.该算法中,通过比较数组中相邻的(奇-偶)位置数字对,如果该奇偶对是错误的顺序(第一个大于第二个),则交换.下一步重复该操作,但针对所有的(偶-奇)位置数字对.如此交替进行下去. 使用奇偶排序法对一列随机数字进行排序的过程 本文地址:http://www.cnblogs.com/archimedes/p/odd-even-sort-algorithm.html,转载

排序算法学习之堆排序

一.堆与堆排序的产生及定义 在简单选择排序中,每次从n个元素中比较n-1次选取最小的元素,这很好理解,但是前面比较过的数据在之后还要重新比较,这将花费大量的运算时间.堆排序算法就很好的解决了这个问题,堆排序在每次选择到最小记录的同时会根据比较结果对其他数据进行调整,堆排序的时间复杂度为O(NlogN). 堆通常是指二叉堆,即堆是一颗完全二叉树,同时其满足一定性质:每个节点的值大于等于其左右孩子的值(大顶堆),或者每个节点的值小于等于其左右孩子的值(小顶堆).堆在本质上是一个数组,根节点即为a[0

排序算法系列:奇偶排序算法

概述 在上一篇中我们说到了冒泡排序的原理及实现详解.冒泡排序是一种交换排序,本文还是接着上一讲,说说另一种交换排序算法--奇偶排序. 版权说明 本文链接:http://blog.csdn.net/lemon_tree12138/article/details/50605563 – Coding-Naga - 转载请注明出处 目录 概述 版权说明 目录 奇偶排序算法 算法原理 算法原理图 算法步骤 算法可行性证明 算法过程图 算法实现 算法复杂度分析 Ref GitHub源码下载 奇偶排序算法 奇