笔试算法题(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):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
随机推荐
- git合并相关问题(copy)
[说明:资料来自http://gitbook.liuhui998.com/3_3.html] 一个Git仓库可以维护很多开发分支.现在我们来创建一个新的叫”experimental”的分支: $ gi ...
- Ubuntu 14.04.1 配置 Android 源码开发环境(jdk版本切换)(转载)
转自:http://www.cnblogs.com/ren-gh/p/4248407.html # Ubuntu 14.04.1 1.更新源: sudo apt-get update 安装vim工具: ...
- 在selenium中一些相对常用的JavaScript事件
输入框输入: 1.找到输入框的id,然后进行输入操作 ordinal :输入框的id parameter :需要输入的内容 browser.execute_script("document. ...
- ASP.NET Core MVC 打造一个简单的图书馆管理系统 (修正版)(一) 基本模型以及数据库的建立
前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/asp ...
- centos mysql数据库忘记密码修改
1.vim /etc/my.cnf 2.在[mysqld]中添加 skip-grant-tables 例如: [mysqld]skip-grant-tablesdatadir=/var/lib/mys ...
- [poj2096] Collecting Bugs【概率dp 数学期望】
传送门:http://poj.org/problem?id=2096 题面很长,大意就是说,有n种bug,s种系统,每一个bug只能属于n中bug中的一种,也只能属于s种系统中的一种.一天能找一个bu ...
- Application,Service,Activity 三者的Context的应用场景
Application 的 context 不是万能的,所以也不能随便乱用,对于有些地方则必须使用 Activity 的 Context, 对于Application,Service,Activity ...
- 使用Qt5.7.0 VS2015版本生成兼容XP的可执行程序
版权声明:本文为灿哥哥http://blog.csdn.net/caoshangpa原创文章,转载请标明出处. 一.直接使用VS2012/VS2013/VS2015生成XP兼容的可执行程序 Visua ...
- logback配置模板
<?xml version="1.0" encoding="UTF-8"?> <configuration> <prope ...
- laravel如何自定义控制器目录
默认控制器在App\Http\Controllers目录下,如何自定义目录呢? 首先我们看一下laravel的请求周期 我们看一下服务提供者RouteServicePrivder文件中的一个函数 /* ...