不使用任何中间变量实现strlen
2009-09-17 20:52
351 查看
借刀杀人,不使用任何中间变量实现strlen
2009腾迅校园招聘笔试题:不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数。函数接口声明如下:int strlen(const char *p);
思路分析:
在字符串中通常可以利用最后一个结束符’/0’,但此处参数为const,只读,那么我们不能打他的主意
函数运行过程中不占用内存基本不可能,除非都使用了寄存器。“不使用中间变量”只是说程序员不能显示的申请内存而已,即不能有局部变量或者动态内存申请。
如果函数自动申请栈内存或者使用寄存器存储变量,或者使用立即数寻址即常量,那么就相当于“不使用中间变量”。
从函数原型看,返回值为int,那么在函数内部必定需要一个地方存储这个值,要么是常数要么是寄存器。长度不为1时不能一次就求出来,说明必须有递归调用,这样递归时函数会自动申请栈内存,这样就相当于程序员“不使用中间变量”了。中间返回的值通过寄存器自动保存,最后一次返回时拷贝到int中去。
C++中也有临时对象的概念,都是程序在运行过程中由编译器在栈中自动申请的对象,对程序员不可见,也相当于“不使用中间变量”
另外一个不申请任何变量的典型题目是:反转字符串(http://blog.csdn.net/sailor_8318/archive/2008/10/11/3058240.aspx)
这种问题都是利用常量,或者将变量的申请交给编译器在递归过程中自动在栈中申请,也就是借刀杀人了,不管我的事,我只是出来打酱油的,哈哈
//////////////////////////////////////////////////////////////////////////
int NoMallocStrlen(const char *str)
{
if (str==NULL)
{
return 0;
}
if (*str != '/0')
{
return 1+NoMallocStrlen(++str);
}
else
return 0;
}
int main()
{
const char *p = "hello!";
int a = NoMallocStrlen(p);
if(a == strlen(p))
{
printf("NoMallocStrlen is well done!/n");
}
else
{
printf("Error!/n");
}
}
2009腾迅校园招聘笔试题:不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数。函数接口声明如下:int strlen(const char *p);
思路分析:
在字符串中通常可以利用最后一个结束符’/0’,但此处参数为const,只读,那么我们不能打他的主意
函数运行过程中不占用内存基本不可能,除非都使用了寄存器。“不使用中间变量”只是说程序员不能显示的申请内存而已,即不能有局部变量或者动态内存申请。
如果函数自动申请栈内存或者使用寄存器存储变量,或者使用立即数寻址即常量,那么就相当于“不使用中间变量”。
从函数原型看,返回值为int,那么在函数内部必定需要一个地方存储这个值,要么是常数要么是寄存器。长度不为1时不能一次就求出来,说明必须有递归调用,这样递归时函数会自动申请栈内存,这样就相当于程序员“不使用中间变量”了。中间返回的值通过寄存器自动保存,最后一次返回时拷贝到int中去。
C++中也有临时对象的概念,都是程序在运行过程中由编译器在栈中自动申请的对象,对程序员不可见,也相当于“不使用中间变量”
另外一个不申请任何变量的典型题目是:反转字符串(http://blog.csdn.net/sailor_8318/archive/2008/10/11/3058240.aspx)
这种问题都是利用常量,或者将变量的申请交给编译器在递归过程中自动在栈中申请,也就是借刀杀人了,不管我的事,我只是出来打酱油的,哈哈
//////////////////////////////////////////////////////////////////////////
int NoMallocStrlen(const char *str)
{
if (str==NULL)
{
return 0;
}
if (*str != '/0')
{
return 1+NoMallocStrlen(++str);
}
else
return 0;
}
int main()
{
const char *p = "hello!";
int a = NoMallocStrlen(p);
if(a == strlen(p))
{
printf("NoMallocStrlen is well done!/n");
}
else
{
printf("Error!/n");
}
}
相关文章推荐
- 借刀杀人,不使用任何中间变量实现strlen
- C/C++面试之算法系列--借刀杀人,不使用任何中间变量实现strlen
- 借刀杀人,不使用任何中间变量实现strlen
- 不使用任何中间变量实现strlen
- 不使用任何中间变量实现strlen
- 不使用中间变量实现字符串长度函数strlen
- 不使用任何辅助变量实现strlen(递归实现strlen)
- 不能使用任何库函数,不能定义任何变量实现strlen和strrev
- 程序员面试宝典—不使用中间变量实现交换
- 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网
- a和b进行交换而不使用任何中间变量
- 不使用中间变量实现两个变量的交换
- 如何不使用任何额外空间实现两数相互交换
- 不使用中间变量实现strlen函数
- 不使用中间变量实现两个整数的交换
- 使用wscript.exe实现kill某个进程,用户无任何感知,不会弹出任何命令的执行窗口
- 在DELPHI7中不使用任何第三方控件,实现放在工具栏上可
- 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网
- Java-实现两个int类型变量值的交换,要求不使用中间变量
- [C语言]strcat strstr strcpy strcmp strlen 的实现与使用