笔试与面试集锦

文中部分内容参考Julyhttp://blog.csdn.net/v_july_v/article/details/11921021#comments

9月5日,华为2014校园招聘的机试题目
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
    1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
    2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数: 
     void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
    输入pInputStr:  输入字符串lInputLen:  输入字符串长度
    输出 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
注意:只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例 
    输入:“cccddecc”   输出:“3c2de2c”
    输入:“adef”     输出:“adef”
    输入:“pppppppp” 输出:“8p”

# include <iostream>
# include <string>
# include <sstream>
using namespace std;
const char in[]= "abbcccddddfffffffffffffffff";
const long inLen=sizeof(in);
char out[inLen];
void StringZip(const char *pInputStr,long InputLen,char *pOutputStr){
	int count=1;
	char a=*(pInputStr++);
	char b;
	while(InputLen>1){
          InputLen--;
		b=*(pInputStr++);
		if(b==a){
		count++;
		}else{
		if(count>1){
	            stringstream ss;
                      string str;
                      ss<<count;
                      ss>>str;
		   int l=0;
		   while(l<str.length()){
			*(pOutputStr++)=(char)str.at(l);
			l++;
			}
			count=1;
			}
			*(pOutputStr++)=a;
			a=b;
		}
	}
}
void main(){
StringZip(in,inLen,out);
cout<<in<<endl;
cout<<out<<endl;
}

 

9月6日,网新恒天2014校园招聘笔试编程题
已知memcpy的函数为: void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指针,src是源指针。不调用c++/c的memcpy库函数,请编写memcpy。
点评:老题,参考答案如下

 

void* memcpy(void *dst, const void *src, size_t count)      
{      
  //安全检查   
    assert( (dst != NULL) && (src != NULL) );        
    unsigned char *pdst = (unsigned char *)dst;      
    const unsigned char *psrc = (const unsigned char *)src;        
  //防止内存重复   
    assert(!(psrc<=pdst && pdst<psrc+count));      
    assert(!(pdst<=psrc && psrc<pdst+count));      
    while(count--)      
   {      
     *(pdst++) = *(psrc++);         
   }       
   return dst;
}

 

 

 

9月9日,迅雷2014校招笔试编程题:
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
链表结点的结构类型定义如下:

struct node
{
 int elem;
 node* next;
};
void difference(node** LA , node* LB)
{
 node *pa , *pb , *pre , *q;
 pre = NULL;
             //1
 while(pa)
 {
  pb = LB;
  while(   )                 //2
   pb = pb->next;
  if(    )                   //3
  {
   if(!pre)
    *LA =      ;     //4
   else
     = pa->next;     //5
   q = pa;
   pa = pa->next;
   free(q);
  }
  else
  {
          ;             //6
   pa = pa->next;
  }
 }
} 
请完成函数void difference(node** LA , node* LB)
点评:参考答案或更多题目请参见: http://blog.csdn.net/hackbuteer1/article/details/11482103
1、2、3、4、5、6六行代码依次为
pa = *LA;
pb && pa->elem != pb->elem
pb
pa->next
pre->next
pre = pa;
代码中的指针pa用于指向集合A的元素;pb指向集合B的元素;临时指针q指向需要被删除的元素;pre用于实现删除时结点的链接,与pa保持所指结点的前后继关系。


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值