编程之美
文章平均质量分 69
一枝春美食
这个作者很懒,什么都没留下…
展开
-
python中在list中添加字典遇到的问题
在写python时,遇到了如上问题,代码复现如下a = []b = {}for i in range(2): b['num'] = i a.append(b)本意是想的到 [{‘num’:0},{‘num’:1}] 但是实际却是 [{‘num’:1},{‘num’:1}]执行id(a[0])和id(a[1])发现这两者的索引是一样的, 这样就能理解了 在py原创 2016-05-28 15:22:29 · 4645 阅读 · 0 评论 -
最小生成树问题的常规分析过程
这里只是给出按照正常自然人的分析过程,不想涉及代码。 首先理解一下什么是最小生成树,用一个例子 要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这就需要找到带权的最小生成树。 实际上这个很像背包问题,但是区别在于最小生成树没有重复问题,只要路径最短就可以了。 下面原创 2015-08-04 22:33:27 · 668 阅读 · 0 评论 -
C中柔性数组(flexible array)的学习
首先看看什么是柔性数组 C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其 他成员。柔性数组成员允许结构中包含一个大小可变的数组。sizeof返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。 基本模型为typedef原创 2015-08-16 21:13:07 · 1578 阅读 · 0 评论 -
编写nios-shell时想到的问题-回车vs换行
在编写nios上类shell用户交互代码时,因为要检测终端输入字符,所以想到了这个问题,故分析之。 回车符的ascii码,ASCII码13 ‘\r’ 换行符的ascii码,ASCII码10 ‘\n’ 符号 ASCII码 意义 \n 10 换行NL \r 13 回车CR回车 \r 本义是光标重新回到本行开原创 2015-07-23 15:35:31 · 845 阅读 · 0 评论 -
改进基于优先队列的最短路径搜索『洪水流思想的体现』
这问题是在博客上看到的,为此学习一下,然后在他的基础上,修改完成迷宫洪水流算法的实现题目是Problem DescriptionAngel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WAL原创 2015-07-22 17:09:02 · 861 阅读 · 0 评论 -
STL--关于权重问题的解决
在A star算法中就出现了权重问题,是数据结构中涉及到权重或者说是优先级的就是优先队列了,为此分析一下,这类问题的共性。在STL中queue头文件中,有priority_queue的类 这是优先队列,在涉及权重问题时可以使用 一般的C++这个类使用时, 1、 priority_queue pq; 这时,库默认是将数值最大的作为优先级最高的输出 2、priority_queue<int,原创 2015-07-21 21:48:17 · 581 阅读 · 0 评论 -
linux之return和exit引发的大问题(vfork和fork)
在coolshell.cn上看到的一个问题,为此拿来研究一下。 首先 看看return和exit的区别 在linux上分别跑一下这个代码int main(){ return 0; //exit(0);}return 0 exit(0) return在返回时会对栈进行操作,将栈清空,然后跳转到调用函数的下一条指令,而exit没有对栈操作,具体exit怎么运行,原创 2015-07-21 13:41:40 · 924 阅读 · 0 评论 -
重新认识Segment fault
对于这个问题,只是之前听说过,并没有研究过。最近在oj编程时,vs上运行没有问题,提交时出现了段错误。为此重视一下这个问题。在维基上给出这个名词的定义 A segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempt原创 2015-08-13 14:45:03 · 810 阅读 · 0 评论 -
GNU LIBC源码学习之strcmp
比较两个字符串我的代码块#include <string.h>int my_strcmp(const char* s1,const char * s2){ if((s1==NULL)||(s2==NULL)) return 0; while(1) { if((*s1=='\0')||(*s2=='\0')) break; if(*s1>*s2) return 1;原创 2015-07-20 20:58:09 · 1140 阅读 · 0 评论 -
每天小练笔10-小和尚挑水(回溯法)
题目 某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表: 和尚1: 星期二,四; 和尚2: 星期一,六; 和尚3: 星期三,日; 和尚4: 星期五; 和尚5: 星期一,四,六; 和尚6: 星期二,五; 和尚7: 星期三,六,日; 请将所有合理的挑水时间安排表 思路 回朔法求解 回朔法即每进行一步,都试图在当前部分解的基础上扩大该部分解。扩大时,首先原创 2015-07-20 17:07:02 · 1504 阅读 · 0 评论 -
图论中最小生成树的问题学习
之前的博客分析过这种问题,并使用伪代码分析过其实现。 首先给出问题背景吧,其实岛屿问题(华为的机试题),要在n个岛屿上之间建桥,要使得所有岛屿联通,因为岛屿之前的距离不一样,所以规划出最短的造桥路径。 为了方便研究,从最简单的三个节点开始 ABC三个岛屿,两两之间的距离如上图。 首先要将这种图的关系存储起来,要用到二维数组#define N 3int g[N][N];图中的关系输入格式原创 2015-08-17 14:57:13 · 1138 阅读 · 0 评论 -
解决关于哈夫曼编码计算带权路径长度问题
这是在做一道编程提示遇到的,学习了一位博主的编码,其中有些问题未能理解,分析解决掉。 首先什么是哈夫曼树: 哈夫曼树,又称最优二叉树,是一类带权路径长度最短的树。 也就是根节点到节点的中的长度最小,当然条件就是,每条路径都是有权重的, 所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的 路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WP原创 2015-07-24 16:54:24 · 7314 阅读 · 0 评论 -
本以为理解const,其实那只是冰山一角
这里首先针对c中const来研究一下,对于c++中在后面的博客中分析。关于教科书里面的一些问题,比如初始化呀什么的,这里就不列举的,下面看看几个问题。第一个问题 看下面这个代码 编译有警告 看看运行结果 这是与我之前的理解又有差异了,在之前的理解是,a的值是不变的,因为这是常量折叠的问题,然而在linux gcc上的运行结果让我困惑了。 如果换到vs2008上,如下同样代码原创 2015-08-21 14:43:08 · 1115 阅读 · 4 评论 -
研究研究看似简单的switch问题
这个问题,之前一直没有去思考,在c和指针这本书中,在谈到switch是给出了这样一段话: 也就是说switch的条件要是整型值?好像一直这么用,却没有研究过为什么。惭愧。。。 研究c语言最好就是看其汇编实现,下面在linux 64位上实验。 编译运行,输出10; 然后将目标文件dump出来int main(){ 40052d: 55原创 2015-08-21 14:05:35 · 1040 阅读 · 0 评论 -
dynamic programming 学习
这是看到一位大神,写的关于dynamic programming的博客,觉得非常好。简单分析下,然后给出链接。背景问题就是 有一个国家,所有的国民都非常老实憨厚,某天他们在自己的国家发现了十座金矿,并且这十座金矿在地图上排成一条直线,国王知道这个消息后非常高兴,他希望能够把这些金子都挖出来造福国民,首先他把这些金矿按照在地图上的位置从西至东进行编号,依次为0、1、2、3、4、5、6、7、8、9,然原创 2015-08-19 16:01:08 · 722 阅读 · 0 评论 -
关于回调函数的一些问题解决
回调函数,之前没有接触过,那就研究研究吧。 最直接的就是,看看一个回调函数的小栗子。 翻阅《c和指针》有一节介绍回调函数,最简单的模型就是:把函数指针作为参数传递给其他函数,然后后者“回调”作为参数的函数。 在网上找一个小代码#include <stdio.h>void printWelcome(int len){ printf("欢迎欢迎 -- %d\n", len);}void pr原创 2015-09-02 22:14:03 · 537 阅读 · 0 评论 -
分析编译器对C关键字的处理『跳过编译器的语法检查,完成很危险的操作』
在c中const这个关键字,维基给出这样一句话 When applied in an object declaration,[b] it indicates that the object is a constant: its value does not change, unlike a variable. This basic use – to declare constants – has原创 2015-08-04 13:30:57 · 999 阅读 · 0 评论 -
链表环问题研究
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。如下图所示 下面分析如何检测出来 首先想到的是是否可以将走过的路径记录下来,每次都需要检测这个是否遍历过, 当然这里考虑链表的长度比较短 首先模拟一个链表环,然后利用vector保存每个链表节点的地址,每次都进行搜索;typedef struct node{ int dat原创 2015-09-01 14:59:01 · 406 阅读 · 0 评论 -
inline陷阱问题
在规范c++编程时遇到的,即类的文件定义常规的对类的使用,在class.h对类进行生命,对于成员函数在class.cpp中定义,如下实现main.cpp#include#include "person.h"using namespace std;int main(){ person p; p.setage(12); cout<<p.backage()<<endl原创 2015-08-05 12:46:58 · 708 阅读 · 0 评论 -
剖析prim最小生成树算法
在上一篇博客中,已经用代码实现了这个算法。只是我认为从算法到代码实现,这是一个很大的过渡,不喜欢教科书式的顺理成章的过渡,虽然下面写的不知所云,虽然我很菜。看完上篇博客中代码,想想其中一些问题, 1、如何将图的相互关系,用合适的数据结构来表示 2、如何搜索某一节点周围的权值路径 3、如何将新的节点加入到新的搜索库中。第一个问题 对于这个图关系,用什么样的数据结构来表示,这里有两两之间的关原创 2015-08-18 13:48:24 · 751 阅读 · 0 评论 -
回溯算法的一些案例分析(c代码实现)
回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为: 1、定义一个解空间,它包含问题的解。 2、利用适于搜索的方法组织解空间。//比如数组等 3、利用深度优先法搜索解空间。 //一般深度优先可以利用 递归实现 4、利用限界函数避免移动到不可能产生解的子空间。 //每次递归判断是否符原创 2015-07-20 13:59:45 · 1087 阅读 · 0 评论 -
按照特定轨迹遍历字符串图
题目大致是这样的, 字符串“PAYPALISHIRING”的一种“之”字型路线是这样的: 如果一行一行的读写,就是PAHNAPLSIIGYIR。所以,如果输入PAHNAPLSIIGYIR和3,就是横着的字符串和层数,输出N轨迹的字符PAYPALISHIRING。首先想到的是如何 将输入字符串,分割开来,比如上面是3层,分成3个字符串,这三个字符串一定是连续的 第一段+第二段+第三段 现在原创 2015-08-12 17:28:43 · 683 阅读 · 0 评论 -
C函数的模拟重载实现说明
在研究printf是,这是一个变参函数,是否可以用这个特性写一个重载函数,当然只是实现模拟。 谷歌说c++实现函数重载是这样的,C++ 实现函数重载很大程度上依赖与编译器对函数名的 Mangling(损坏,破坏),即 C++ 的源代码被编译后同名的重载函数名字会被破坏,一般是在原函数名前后加上特定的字符串,以区分不同重载函数,然后在调用的时候根据参数的不同选择合适的函数。从网上搞到一段代码#inc原创 2015-07-08 14:43:26 · 454 阅读 · 0 评论 -
每天小练笔6-空瓶换饮料
题目 描述: 有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?原创 2015-07-07 17:22:38 · 949 阅读 · 0 评论 -
每天小练笔4-整数排序操作
题目 描述: 实现输入一组大于等于0的整数,根据从小到大的顺序排序后输出,排序后有连续数时,只输出连续数中最小和最大的两个数。 题目类别: 排序 难度: 高级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 一组大于等于0的整数,不考虑非法输入,各个整数之间以逗号(“,”)分隔, 输入字符串的总长度小于等于100个字节。 输出:原创 2015-07-07 14:23:33 · 460 阅读 · 0 评论 -
每天小练笔3-简单密码
题目 描述: 密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。 假设渊子原来一个BBS上的密码为zvbo9441987,为了方便记忆,他通过一种算法把这个密码变换成YUANzhi1987,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。 他是这么变换原创 2015-07-07 13:34:25 · 1678 阅读 · 0 评论 -
每天小练笔1-周期串问题
这个系列的题目都是来源于网络,然后自己写代码,可能不是最佳方法,网上有好的算法我也会给出链接。 题目一[周期串问题] 如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3)。字符串的长度小于等于100,由调用者保证。 接口说明 原型: int GetMinPeriod(char原创 2015-07-03 20:12:31 · 496 阅读 · 0 评论 -
每天小练笔2-大数求和
这个系列的题目都是来源于网络,然后自己写代码,可能不是最佳方法,网上有好的算法我也会给出链接。 描述: 给定两个非常大的正整数A和B,位数在50至100之间。求C=A+B; 题目类别: 字符串 难度: 中级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 因为A和B很大,从高位到低位,以字符串的形式输入两行数字A和B。A和B的位数在原创 2015-07-03 20:36:28 · 439 阅读 · 0 评论 -
深入分析由前序和中序重构二叉树问题
由下面的这棵树来分析 前序遍历: ACFKDBUMWS 中序遍历: KFDCAUBWMS实际前序遍历的组成是 根节点+左边+右边 实际中序遍历的组成是 左边+根节点+右边step1 前序遍历的第一个为根结点 ,所以A为根节点, step2 在中序中找到A,分为两组 KFDC 根节点左边 UBWMS 根节点右边 而前序遍历中也可以分开了(只是顺序不一样,个数一样) C原创 2015-07-10 09:24:39 · 842 阅读 · 0 评论 -
函数的指针参数传出时遇到的问题
一般而言,函数传出值是没有什么问题的, 一般是这样 要将值传出来,用指针; 要将指针传出来,用二级指针; 最明显的错误是下面的void test(char a,char b){ b=a; }int main (){ char c=‘A’; char d='B'; test(c,d); cout<<b<<endl; return 0;原创 2015-07-10 14:59:41 · 786 阅读 · 0 评论 -
c与c++中一些类型的转化总结(持续更新)
一般写小代码时,常常是c和c++不分的,但是有时会遇到类型转换的问题,比如输入 string ,然而处理函数的参数是char*型,之间需要转换。收集一下网上资料,总结一下。因为还没有时间去研究stl源码,暂时先用着吧。 一、string转char* 1、std::string::c_str Returns a pointer to an array that contains a null-t原创 2015-07-10 13:18:43 · 899 阅读 · 0 评论 -
每天小练笔5-删除重复字符
题目 描述: 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。 题目类别: 字符串 难度: 中级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。 输出: 删除字符原创 2015-07-07 16:32:20 · 468 阅读 · 0 评论 -
每天小练笔8-模拟进程调度
题目 操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中, 系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。 现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。 函数scheduler实现如下功能: 将task[] 中的任务按照系统任务、用户任务依次存放原创 2015-07-14 20:25:56 · 605 阅读 · 0 评论 -
nios软核cpu中架构类shell的一种解决方式『linux 系统函数调用的方法』
在nios中要实现一个类shell的交互系统,用户在终端可以通过命令调用系统函数。 想到linus当年在写下系统函数调用时,其实基于的思想是一样的,就是查表,每一种系统函数都对应一种中断服务号,然后通过0x80系统调用进入内核,然后查表,这里就可以找到对应的内核系统函数,回顾一下linus是怎么做到的。 就以系统函数open为例子int open(const char * filename, i原创 2015-07-31 10:25:32 · 708 阅读 · 0 评论 -
GNU-LIBC源码学习之strlen
问题来源于一道很小的编程题,要求写出strlen的函数。 很来很容易str为字符指针 int cnt=0; while(*str != '\0') cnt++; return cnt;在vs2008上顺利执行,但是在题目系统中出问题 题目给的要求是 1000ms 10000K 那就是这种算法超时了, 想想算距离,除了这种计数原创 2015-07-13 21:33:30 · 1849 阅读 · 0 评论 -
C++中的引用在初始化时占用内存吗?
这个问题,还没有完全研究完,先贴上一部分实验结果。 这里比较疑惑的有两个问题,c++中是怎么实现引用的和引用会和指针一样占用内存吗? 其实是一个问题,下面的实验都是在linux64 g++编译器平台 看第一段代码#include<iostream>using namespace std;int main(){ int a=10; int* p =&a; int &q =a; cout原创 2015-08-25 15:35:56 · 1025 阅读 · 0 评论 -
关于浮点数的一些问题
在stackoverflow中看到的,之前用float类型数据比较少,所以没怎么研究。现在看看 看看测试代码int main(){ float a = 0.7; float b = 0.5; if (a < 0.7) { if (b < 0.5) printf("2 are right"); else printf("1原创 2015-08-25 10:22:01 · 805 阅读 · 0 评论 -
小编程题--解决一维迷宫问题
题目源于计蒜客,如下题目给定一个非负整数数组,假定你的初始位置为数组第一个下标。数组中的每个元素代表你在那个位置能够跳跃的最大长度。请确认你是否能够跳跃到数组的最后一个下标。例如:A = [2,3,1,1,4],return true.A = [3,2,1,0,4],return false.格式:第一行输入一个正整数n,接下来的一行,输入数组A[n]。如果能跳到最后一个下标,输出原创 2015-07-29 12:05:46 · 1307 阅读 · 1 评论 -
解决c/c++的sequence points和side effects问题
在看一篇文章时,提到这样一段代码#include <stdio.h>void foo(void){int a = 41;a = a++;printf("%d\n", a);}int main(void){foo();}本以为很简单嘛,就是不要忘了a赋值之后还要自己。其实是自己想的太简单了。 因为在vs2008和linux gcc下跑的结果不一样。研究一下这里面的原因。 在vs原创 2015-08-10 15:14:27 · 1097 阅读 · 1 评论 -
重现二叉搜索树递归构建的过程
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。简单而言就是 左边的小于中间 中间的小于右边首先建立几个数据变量#define TYPE i原创 2015-07-16 15:20:50 · 1173 阅读 · 0 评论