笔试算法题(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):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
随机推荐
- 开源可扩展的Web视频播放器:Clappr Player
http://www.open-open.com/lib/view/open1417057033846.html http://www.csdn.net/article/2014-11-27/2822 ...
- poj1419 求最大独立集
题目链接:http://poj.org/problem?id=1419 题意:求最大独立集 思路: 这里有一个定理: 最大独立集=补图的最大团最大团=补图的最大独立集 所以这里我们只要求给出的图的最大 ...
- phpstorm最新破解办法(2016-10-30)
还是选择license server.然后复制http://jetbrains.tencent.click/ 这个地址进去就可以啦.不行的时候欢迎留言告知,更新破解方法
- java中WGS84坐标(ios)转换BD-09坐标(百度坐标)
iPhone的GPS定位(CLLocationManager)获得的经纬坐标是基于WGS-84坐标系(世界标准),Google地图使用的是GCJ-02坐标系(中国特色的火星坐标系),百度的经纬坐标在G ...
- bind: Invalid argument
出现此问题在于,listen函数在socket函数和bind函数之间. 例: /*客户端程序开始建立sockfd描述符*/ listenfd = socket(AF_INET,SOCK_STREAM, ...
- 安卓Activity全屏显示以及不显示title
1.让Activity全局显示,使系统的导航栏变为透明: (1)可以在Activity代码中添加window属性: if(VERSION.SDK_INT >= VERSION_CODES.KIT ...
- JAVA大数处理(BigInteger,BigDecimal)
原文链接 Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类. 这两个类都在java.math.*包中,因此每次必须在开头处引用该包. Ⅰ基本函数: 1.valu ...
- PHP获取今天内的时间 今天开始和结束的时间戳
$t = time(); $start = mktime(0,0,0,date("m",$t),date("d",$t),date("Y", ...
- [C#基础知识系列]专题十:全面解析可空类型[转]
原文链接 主要内容: 1:空合并操作符(?? 操作符) ??操作符也就是"空合并操作符",它代表的意思是两个操作数,如果左边的数不为null时,就返回左边的数,如果左边的数为nul ...
- JS 对输入判断变化屏蔽中文输入法连续输入时触发的事件
//智能搜索提示 IntelligenceSearch: function IntelligenceSearch() { $('#keyWord').on('input', function () { ...