经典算法--很小的算法理解算法的本质

//rplace.c
//题目:假设存在字符串“qwer tyubfg hsdf   jjhg  ”,并且该字符串具有足够大的空间编写算法将其中的空格字符用“%20”代替。
//要求:时间复杂度:O(n),空间复杂度:S(1)。
//算法分析:
//要实现时间复杂度为O(n),必须采用一重循环,并且循环控制由数组长度n控制,可以采用多次循环。
//  则不可用算法:    遍历数组遇见空格将空格替换成%20,然后将其后的各个元素向后移动,最坏的时间复杂度为:O(n^2),空间复杂度为:
//  S(1)。
//要实现空间复杂度为S(1),必须用可见的,确定的中间变量。
//  则不可用算法:重新申请一个空的数组,然后将变换数组遍历,遇见空格在新数组中填入“%20”,非空格则赋值为变换数组的该位元素。
//  这种算法时间复杂度虽为O(n),但是空间复杂度为:S(n)。
//个人理解:  根据当前的生活环境和科技的发展状况,个人认为在大部分应用开发,时间复杂度是优于空间复杂度的,但是取舍总会有代价,
//  也是有相对性的,
//  所以算法没有最好只有相对最优,请根据自己的开发环境、要求、工作性质去选择最适合的算法。
//符合题目要求的算法:遍历两遍变换数组,第一遍,求出有几个空格,从而求出目标数组的长度。第二遍,两个指针,一个指向原数组最后
//  一个元素的地址记为olast,一个指向目标数组的最后一个元素地址记为nlast,从后向前进行遍历,用原数组长度作为循环控制条件,当
//  olast指向的元素为空格时,nlast指针依次写入‘0’,‘2’,‘%’,当olast指向的元素不为空格时,nlast指针写入olast指针所指的
//  字符,当olast指针与nlast指针指向同一个位置即:到数组首地址偏移量相同时,就完成替换。(这里为了方便理解用两个指针说明,当
//  然,在具体实现的时候,定义两个整型,做为数组名的下标来表示这两个指针,最后结束条件为下标相等就好了)。
//***************************************************************************************************************************
//代码实现:

//2015-5-25
//***************************************************************************************************************************
//
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define STRMAX 100
void rplace(char *str);

int main(void)
{
    char str[STRMAX] = "12 wer rty uiioo    gdhsg     hdaj k";
    rplace(str);
    puts(str);
    return 0;
}

void rplace(char *str)
{
    int i = 0;
    int olen = 0, nlen = 0, num = 0;

if(NULL == str)

exit(0);

olen = strlen(str);
    for( ; i<olen; ++i)
        if(‘ ‘ == str[i])
            ++num;
    nlen = olen + num*2;

while(olen < nlen)
    {
        if(‘ ‘ != str[olen])
        {
            str[nlen] = str[olen];
            --nlen;
        }
        else
        {
            str[nlen--] = ‘0‘;
            str[nlen--] = ‘2‘;
            str[nlen--] = ‘%‘;
        }
        --olen;
    }
}
//代码很简单,算法也很简单,这是一种思维方式,并不只是针对这到题目,学习算法,理解算法是初步,融会贯通才是王道。

时间: 2024-10-03 13:46:07

经典算法--很小的算法理解算法的本质的相关文章

根据之前的博文,我把给同学做的三子棋小游戏的代码发出来,只是界面很丑很丑,AI算法很笨很笨,过几天我传到网盘上,提供大家下载娱乐

1 background_image_filename = 'blackground.png' 2 black_mouse_image_filename = 'black.png' 3 white_mouse_image_filename = 'white.png' 4 restart_icon_filename='restart.png' 5 pingju_icon_filename='pingju.jpg' 6 win_icon_filename='win.jpg' 7 lose_icon_

【算法整理】听说你写的算法很牛?-优质算法衡量标准探讨

引文 我有个朋友有算法强迫症,每次一看到别人写的算法,就有上去改的冲动,不然就会偏头疼,主要症结在于他认为别人写的算法不好,但是什么的算法可以评判为好,什么样的算法可以评判为不好?最近为了治愈他,我特地写了这篇文章. 算法的衡量从两个方向出发:时间复杂度和空间复杂度.本文主要是不讲具体算法,只将算法的衡量,重点讲解如何衡量算法的复杂度,解决平时见到的XX算法时间复杂是O(logn)O(logn),其中这个结果是怎么推导出来的?lognlogn是个什么玩意儿?,大写的OO是什么意思?为什么用这个符

查找第K小的数 BFPRT算法

BFPRT算法是解决从n个数中选择第k大或第k小的数这个经典问题的著名算法,但很多人并不了解其细节.本文将首先介绍求解这个第k小数字问题的几个思路,然后重点介绍在最坏情况下复杂度仍然为O(n)的BFPRT算法. 一 基本思路 关于选择第k小的数有许多方法 将n个数排序(比如快速排序或归并排序),选取排序后的第k个数,时间复杂度为O(nlogn). 维护一个k个元素的最大堆,存储当前遇到的最小的k个数,时间复杂度为O(nlogk).这种方法同样适用于海量数据的处理. 部分的快速排序(快速选择算法)

HDU 1098 Ignatius&#39;s puzzle 费马小定理+扩展欧几里德算法

题目大意: 给定k,找到一个满足的a使任意的x都满足 f(x)=5*x^13+13*x^5+k*a*x 被65整除 推证: f(x) = (5*x^12 + 13 * x^4 + ak) * x 因为x可以任意取 那么不能总是满足 65|x 那么必须是 65 | (5*x^12 + 13 * x^4 + ak) 那么就是说 x^12 / 13 + x^4 / 5 + ak / 65 正好是一个整数 假设能找到满足的a , 那么将 ak / 65 分进x^12 / 13 + x^4 / 5中得到

约瑟夫问题 算法很简单保证每隔人都能看懂用数组实现 利用循环删除数组中的元素

#include<iostream> using namespace std; const int size = 1000; void ArrDel() { int arr[size]; //循环结束标志,一直循环到数组中只剩下最后一个元素结束 int currentNum = size; int count = 0; for (int k = 0; k < size; k++) { arr[k] = k; } //currentNum==1表示数组中只剩下最后一个元素 是循环结束的标志

算法很重要,但是,并非所有,并不是每个人的选择

[信] 何老师,你好. 我是一个软件project大二.两年下来.我有很好的成绩,此外,他自学了一些事情.大一的时候我自学C++.NET编程.然后看着别人写的炸弹人的代码自己也写了一个(感觉像是抄了一次),大二上学期的时候感觉对嵌入式开发有些兴趣,所以自学了Intel的IA-32汇编和LinuxC编程.可是我学的这些都不是非常深,特别是学LinuxC的时候.由于对操作系统不熟悉所以非常多进程方面的东西当时也没弄懂. 如今在自学Android,学完0基础内容.打算深入学习的时候.却有师兄跟我说An

斯坦福大学公开课机器学习:machine learning system design | data for machine learning(数据量很大时,学习算法表现比较好的原理)

下图为四种不同算法应用在不同大小数据量时的表现,可以看出,随着数据量的增大,算法的表现趋于接近.即不管多么糟糕的算法,数据量非常大的时候,算法表现也可以很好. 数据量很大时,学习算法表现比较好的原理: 使用比较大的训练集(意味着不可能过拟合),此时方差会比较低:此时,如果在逻辑回归或者线性回归模型中加入很多参数以及层数的话,则偏差会很低.综合起来,这会是一个很好的高性能的学习算法. 原文地址:https://www.cnblogs.com/chenwenyan/p/8326027.html

tweenjs缓动算法使用小实例

这里的tweenjs不是依托于createjs的tewwnjs,而是一系列缓动算法集合.因为本身是算法,可以用在各个业务场景中,这也正是总结学习它的价值所在.tweenjs代码详情: 1 /* 2 * Tween.js 3 * t: current time(当前时间): 4 * b: beginning value(初始值): 5 * c: change in value(变化量): 6 * d: duration(持续时间). 7 * you can visit 'http://easing

NOIP200805 笨小猴(低效算法)(一大桶水)【A006】

[A006]笨小猴[难度A]—————————————————————————————————————————————————————————————— [题目要求] 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,