笔试算法题(04):实现 string & memcpy & strcpy & strlen
出题:请实现给定String的类定义;
分析:注意检查标准类构造注意事项;
解题:
#include <stdio.h>
#include <string.h>
/**
* 检查是否需要构造函数
* 检查是否需要无参构造函数
* 检查是否需要成员变量(函数)私有
* 检查是否需要在构造函数预初始化成员变量
* 检查是否需要析构函数
* 检查是否需要虚拟析构函数
* 检查是否需要复制构造函数(参数为const)
* 检查是否需要赋值重载函数(参数为const)
*
* */
class MyString {
public:
MyString(const char *str=NULL);//普通和无参构造函数
MyString(const MyString&);//拷贝构造函数
~MyString();//析构函数
MyString& operator=(const MyString&);//重载操作符函数
private:
char *m_data;
};
MyString::MyString(const char *str) {
if(str==NULL) {
m_data=new char[];
*m_data=" ";
} else {
int length=strlen(str);
m_data=new char[length+];//需要为\0预留空间
strcpy(m_data, str);
}
}
MyString::MyString(const MyString& other) {
int length=strlen(other.m_data);
strcpy(m_data, other.m_data);
}
MyString::~MyString() {
delete [] m_data;
}
MyString& MyString::operator=(const MyString& other) {
if(this==&other) {//需要判断是否为对象本身,否则可能double deletion
return *this;
}
delete [] m_data;
int length=strlen(other.m_data);
m_data=new char[length+];
strcpy(m_data, other.m_data);
return *this;
}
出题:写一个函数,完成内存之间的复制(注意完整性);
分析:当dest的起始位置在src到src+count之间时,dest会覆盖掉src后面的内存,所以应该使用倒序复制;
解题:
/**
* 内存中字符串有五种相对位置,两种重叠的情况需要考虑内存破坏问题
* 1
* ****
* ****
* 2
* ****
* ****
* 3
* ****
* ****
* 4
* ****
* ****
* 5
* ****
* ****
* */
void* MyMemoryCopy(void *dest, const void *src, size_t count) {
if(dest==NULL && src==NULL) return NULL; char *pdest=static_cast(src);
const char *psrc=static_cast(src);
//字符串在内存中的存储方向是由低地址往高地址方向
if(pdest>psrc && pdest<psrc+count) {
for(size_t i=count;i!=-;i--) {
pdest[i]=psrc[i];//逆序拷贝
}
} else {
for(size_t i=;i<count;i++) {
pdest[i]=psrc[i];//顺序拷贝
}
}
return dest;
}
出题:正确的strcpy的实现;
分析:返回值为char *,为了形成链式表达式;
解题:
char *strcpy(char *strDest, const char *strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));
strSrc=const_cast<char *>(strScr);
char *address=strDest;
while((*strDest++=*strSrc++)!='\0')
return address;
}
. 正确的strcmp的实现
int strcmp(const char *str1,const char *str2)
{
assert(str1!=NULL && str2!=NULL);
int ret=;
while(!(ret=*(unsigned char *)str1 - *(unsigned char *)str2) &&
*str2)
{
str1++;
str2++;
}
return ret;
}
出题:正确的strlen的实现;
分析:Strlen可以计算以\0结尾的字符串的长度,长度包括除\0以外的所有字符,sizeof也能计算字符串的程度,但是它的结果包含了\0终止字符;
解题:
int strlen(const char *str)
{
assert(str!=NULL);
int len;
while((*str++)!='\0')
{
len++;
}
return len;
}
笔试算法题(04):实现 string & memcpy & strcpy & strlen的更多相关文章
- 前端如何应对笔试算法题?(用node编程)
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...
- 笔试算法题(12):整数的string到int转换 & 两个栈实现队列
出题:将输入的表示整数的字符串转变为对应的整数值: 分析: 每当右边增加一位,说明之前的sum应该高一个数量级,所以*10.由于这两个实现仅仅考虑正规的.正整数输入,所以需要一个Wrapper函数,其 ...
- php笔试算法题:顺时针打印矩阵坐标-蛇形算法
这几天参加面试,本来笔试比较简单,但是在面试的时候,技术面试官说让我现场写一个算法,顺时针打印矩阵的坐标,如图所示 顺序为,0,1,2,3,4,9,14,19,24,23,22,21,20,15,10 ...
- 笔试算法题(45):简介 - AC自动机(Aho-Corasick Automation)
议题:AC自动机(Aho-Corasick Automation) 分析: 此算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一:一个常见的例子就是给定N个单词,给定包含M个字符的文章,要求 ...
- 笔试算法题(40):后缀数组 & 后缀树(Suffix Array & Suffix Tree)
议题:后缀数组(Suffix Array) 分析: 后缀树和后缀数组都是处理字符串的有效工具,前者较为常见,但后者更容易编程实现,空间耗用更少:后缀数组可用于解决最长公共子串问题,多模式匹配问题,最长 ...
- 笔试算法题(20):寻找丑数 & 打印1到N位的所有的数
出题:将只包含2,3,5的因子的数称为丑数(Ugly Number),要求找到前面1500个丑数: 分析: 解法1:依次判断从1开始的每一个整数,2,3,5是因子则整数必须可以被他们其中的一个整除,如 ...
- 【每天一道算法题】Lucky String
A string s is LUCKY if and only if the number of different characters in s is a fibonacci number. Gi ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)
议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
随机推荐
- IE浏览器下错误,不能执行已释放script的代码
错误提示: 错误原因: 我使用layui打开子页面,用到了父页面中的一个全局变量(我用的数组),子页面关闭后,使用该数组方法(如:arr.join(",")),便提示此错误 我的解 ...
- StretchedBillboard 实现
参考Unity粒子系统的StretchedBillboard,在保持模型的右朝向不变的情况下,尽量朝向摄像机 转化为数学问题: 一个向量在一个面上的投影 基础的Billboard的方向应为: 从中点指 ...
- pyinstaller打包.py程序为.exe操作指南
pyinstaller打包.py程序为.exe操作指南 20190526内容纲要: 1.pyinstaller安装 2.程序封装 3.可执行程序 0 前言 今天第一次试试将一个py程序封装成一个.ex ...
- Allure对单测结果以及robotframework结果的处理
Allure对单测结果以及robotframework结果的处理 Allure只能针对pytest的单测结果生成相应的报告: 如果需要对unittest的测试框架结果进行展示,可以使用pytest执行 ...
- Linux命令-自动挂载文件/etc/fstab功能详解
Linux命令-自动挂载文件etcfstab功能详解 一./etc/fstab文件的作用 磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,否则下次开机启动时仍然需要重新挂载. 系 ...
- pycharm2017.1破解方法
破解专业版,在server选项里边输入 http://elporfirio.com:1017/就可以了
- Drawable(7)让一个没有pressed状态的控件使用StateList,显示pressed图片。
TextView没有按下状态,Button有. 如图1,内容1在一个TextView上,默认它并没有按下状态. 如何让TextView有呢. 在xml中加入属性: android:clickable= ...
- iOS判断输入的字符串是否是纯数字
主要用于判断输入到TextField的内容是不是数字,比如需要输入电话号码的时候. 网上查看了一些资料,一般都是通过协议. 以下内容来自:http://www.2cto.com/kf/201404/2 ...
- Linux oraenv Tips
Linux for the Oracle DBA -Customizing the Oracle User's Environment There are many ways to customize ...
- 算法和数据结构~Sqlserver索引使用的B树
B树相关概念 在B-树中查找给定关键字的方法是,首先把根结点取来,在根结点所包含的关键字K1,…,Kn查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功:否则,一定可以 ...