笔试算法题(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):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
随机推荐
- linux 安装和远程连接
准备工作: 1.请安装好vmware 软件 2.linux 镜像包 3.putty 远程连接工具 任务: 设置好root 账号和普通账号 及设置网络 连接最简单使用桥接 只能ping 通 本机 nat ...
- jQuery笔记之Easing Plugin
jQuery easing 使用方法首先,项目中如果需要使用特殊的动画效果,则需要在引入jQuery之后引入jquery.easing.1.3.js<script type="text ...
- setsockopt()函数功能介绍
功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时, 选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的 ...
- Unix\Linux | 总结笔记 | 命令_ WC
wc[选项][参数] wc命令用来计算数字.利用wc指令我们可以计算文件的Byte数.字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据. -c或--byt ...
- poj 1664 放苹果 递归
题目链接: http://poj.org/problem?id=1664 题目描述: 有n个苹果,m个盒子,盒子和苹果都没有顺序,盒子可以为空,问:有多少种放置方式? 解题思路: 当前有n个苹果,m个 ...
- 如何用PS快速做出3D按钮效果的图片
1 先建立一个透明图层 2:再创建一个矩形 3:选用过喷样式 4: 双击图层并应用蓝色,记得这里应该复制下颜色的16进制值. 效果如图所示 取消光泽选项,大功告成! 最终效果如图所示,将其保存为PNG ...
- 30款jQuery常用网页焦点图banner图片切换
1.jquery 图片滚动特效制作 slide 图片类似窗帘式图片滚动 查看演示 2.jquery幻灯片插件带滚动条的圆形立体图片旋转滚动 查看演示 3.jQuery图片层叠旋转类似洗牌翻转图片幻灯片 ...
- Objective-C Properties
Objective-C Properties Apple introduced properties, a combination of new compiler directivesand a ne ...
- Python学习 Day 12 调试 断言 logging pdb pdb.set_trace
调试 第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看: >>> def foo(s): n= int(s) print '>>> n = ...
- GIS在石油行业中的应用
在石油工业中,发现新的石油资源,取得竞争优势,是成功的关键之一.GIS系统能帮助评估潜在的石油资源,及时.准确.直观地定位油气资源的空间分布及其特征,以正确有效地开展部署勘探开发工作,占领市场先机. ...