两个问题都是字符串类型的。
第一个问题是机考的第二题,第二个问题是技术面时考官考察我的问题。
第一个问题:
输入一个字符串(长度最大128字节),格式如”1,23,45,2,128,9”从中计算是2的整数次幂的数的个数。
当时调试程序,判断一个整数是否是2的整数次幂的算法,我是用了递归调用的方法很快就调通了,但是从字符串中提取数字的程序一直困扰到答题结束。之后技术面的时候,还和面试官讨论了这个问题,从面试官那得到了提示下,回到家后试了下strtok函数终于调通了这是后话。
粘出相关代码:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
//判断一个非负整数是否是的整数次幂
bool judge2mi(unsigned int num)
{
unsigned int tmp=0;
bool result=false;
if(num==0)
{
return false;
}
else
if(num==1)
{
return true;
}
else
if(num%2==0)
{
tmp=num/2;
result=judge2mi(tmp);//递归调用
}
else
{
return false;
}
return result;
}
/*将数字字符串转化为数字
参数:表示数字的字符串,如,,45,,123
参数:数组存放从参数中提取的数字
返回值:提取的数字个数
*/
int str2int(char *str,int num[64])
{
unsigned int result;
int i=0;
char *token=NULL;
char seps[]=",";
token=strtok(str,seps);
printf("提取的数:\r\n");
while(token!=NULL)
{
num[i]=_strtoi64(token,NULL,0);
printf("%d\r\n",num[i]);
// printf("%s\r\n",token);
i++;
token=strtok(NULL,seps);
}
return i;
}
int _tmain(int argc, _TCHAR* argv[])
{
bool result=false;
unsigned int num=0;
char str[128],i=0;
int str2num[64]={0},m=0;
scanf("%s",str);
m=str2int(str,str2num);
/*for(i=0;i<63;i++)
printf("%d\r\n",str2num[i]);*/
printf("偶数:\r\n");
for(i=0;i<m;i++)
{
result=judge2mi(str2num[i]);
if(result==true)
{
printf("%d\r\n",str2num[i]);
num++;
}
}
printf("num is :%d",num);
return 0;
}
第二个问题:
输入一个字符串1例如“afsadfasdf”,和字符串2“as”,查找字符串2在字符串1中出现的次数。
当时我没有想到strstr函数,很汗,平时对字符串的操作极少,这个都不知道,我当时给出的方式是自己写的函数,比较繁琐。
期间在谈论如何计算一个字符串的长度时,讨论了sizeof关键字和strlen()的用法。
char * str=”asfdf”; sizeof(str) 4 strlen(str) 5
char str[]=”asfdf”; sizeof(str) 6 strlen(str) 5
char str[10]=”asfdf”; sizeof(str) 10 strlen(str) 5
sizeof的操作对象是类和变量,而函数strlen的操作对象是字符串,且长度不计入’\0’。
粘出相关代码:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int _tmain(int argc, _TCHAR* argv[])
{
char *str1=(char*)malloc(1024);
char *str2=(char*)malloc(1024);
char *pdest=NULL;
int result=0;
scanf("%s %s",str1,str2);
//scanf("%s",str1);
//scanf("%s",str2);
printf("%s\r\n",str1);
printf("%s\r\n",str2);
pdest=strstr(str1,str2);
while(pdest!=NULL)
{
result++;
pdest+=strlen(str2);
pdest=strstr(pdest,str2);
}
printf("result:%d",result);
return 0;
}
还有一点,作为一位软件工程师,工作中的代码量是值得注意的。我就没概念,当面试官问我去年的代码量时,我随口报出2000+,一度让面试官以为我不怎么写代码,后来回到单位看了下最近一个月写的单片机程序都1000+行了,去年实际我写的应用在工程中的代码足足有10000+行。感觉,作为一名应聘者我还是蛮low的。毕业后第一次跳槽前的面试心得,纪念下。