阿里的电面要我用C/C++实现一个字符串拷贝的函数,虽然以前写过 strcpy 的函数实现,但时间过去很久了,再加上有点紧张,突然就措手不及了。最后写是写出来了,但没考虑异常的情况,面试官好像很不满意。(T_T),写篇文章记录一下,以免日后重蹈覆辙。
一、字符串拷贝strcpy
函数strcpy
的原型是char* strcpy(char* des , const char* src)
,des 和 src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串。
李松
阿里的电面要我用C/C++实现一个字符串拷贝的函数,虽然以前写过 strcpy 的函数实现,但时间过去很久了,再加上有点紧张,突然就措手不及了。最后写是写出来了,但没考虑异常的情况,面试官好像很不满意。(T_T),写篇文章记录一下,以免日后重蹈覆辙。
函数strcpy
的原型是char* strcpy(char* des , const char* src)
,des 和 src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串。
二叉查找树(Binary Search Tree)又叫二叉排序树(Binary Sort Tree),它是一种数据结构,支持多种动态集合操作,如 Search、Insert、Delete、Minimum 和 Maximum 等。
二叉查找树要么是一棵空树,要么是一棵具有如下性质的非空二叉树:
若左子树非空,则左子树上的所有结点的关键字值均小于根结点的关键字值。
若右子树非空,则右子树上的所有结点的关键字值均大于根结点的关键字值。
左、右子树本身也分别是一棵二叉查找树(二叉排序树)。
构造函数中可不可以抛出异常?当然可以。从语法上来说,是可以的;从实际情况来看,现在的软件系统日渐庞大和复杂,很难保证 Constructor 在执行过程中完全不发生一点异常。
那么,如果构造函数中抛出异常,会发生什么情况呢?
C++仅能 delete 被完全构造的对象(fully constructed objects),只有一个对象的构造函数完全运行完毕,这个对象才被完全地构造。所以如果在构造函数中抛出一个异常,这个异常将传递到创建对象的地方(程序控制权也会随之转移),这样对象就只是部分被构造,它的析构函数将不会被执行。
摘要:基于 Jsoup 实现一个 Android 的网络爬虫程序,抓取网页的内容并显示出来。写这个程序的主要目的是抓取海投网的宣讲会信息(公司、时间、地点)并在移动端显示,这样就可以随时随地的浏览在学校举办的宣讲会信息了。
Jsoup 是一个 Java 的开源HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常方便的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
Jsoup主要有以下功能:
摘要:作为新一代的加密标准,AES 旨在取代 DES(请看《DES加密算法的C++实现》),以适应当今分布式开放网络对数据加密安全性的要求。本文在分析了 AES 加密原理的基础上着重说明了算法实现的具体步骤,并用 C++ 实现了对文件的加密和解密。
AES(高级加密标准,Advanced Encryption Standard),在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种分组加密标准。这个标准用来替代原先的 DES,目前已经广为全世界所使用,成为对称密钥算法中最流行的算法之一。
《信息安全技术》这门课又在讲 DES 加密算法了,以前用纯C写过一次,这次我用 C++ 重新写了一个,写篇文章以备后用。本文介绍了 DES 算法加密的大致步骤和整体流程。
DES算法是一种最通用的对称密钥算法,因为算法本身是公开的,所以其安全性在于密钥的安全性。基于密钥的算法通常有两类:对称算法和公开密钥算法。对称算法的对称性体现在加密密钥能够从解密密钥推算出来,反之亦然。在大多数对称算法中,加解密的密钥是相同的,DES就是这样。可见,对称密钥算法的加解密密钥都是保密的。而公开密钥算法的加密密钥是公开的,解密密钥是保密的。
下面是 DES 加密算法的整体流程图:
上篇讲到使用动态规划可以在 θ(mn) 的时间里求出 LCS 的长度,本文将讨论如何输出最长公共子序列。
*问题描述:给定两个序列,例如 X = “ABCBDAB”、Y = “BDCABA”,求它们的最长公共子序列的长度。*
下面是求解时的动态规划表,可以看出 X 和 Y 的最长公共子序列的长度为4:
动态规划(Dynamic Programming)是一种设计的技巧,是解决多阶段决策过程最优化问题的通用方法。
基本思想:将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解(这部分与分治法相似)。与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。通常可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划的基本思路。
采用动态规划求解的问题需要具有两个特性:
写一个简单的计算器并不是什么很难的事,主要目的是要通过这个程序来学习和分析其中的核心算法。这个简易计算器的核心部分就是对输入的表达式的正确性判断与求值,其中包括对表达式的解析、中缀表达式转后缀表达式、后缀表达式求值等等几个方面。
上一篇讲到,通过编译原理的方法(词法分析和语法分析)来判断字符串表示的算术表达式的合法性。这一篇,接着讲在算术表达式合法的情况下,对表达式进行求值。
表达式的求值是栈应用的一个典型范例。我们一般通过后缀表达式(逆波兰式)进行求值,