`
chriszeng87
  • 浏览: 717387 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

EMC面试题

阅读更多

1.一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的 相对顺序 比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时间复杂度O(N),空间O(1) 。 

 

2.有两堆东西,一堆4个,一堆7个,两个人开始拿东西,一次可以拿任意个,但只能从一堆中拿。现规定:如果最后剩下一个,而且轮到谁拿谁就输了。现在你先拿,请问有致胜方法吗?

 

3.手机上每个数字对应几个字母,给你一串数字,请你输出所有可能的字符串。要求是最好的算法。好像这个《编程之美》上面有的。有个疑问,这里是不是要注意的一点:如果有相同数字出现,由输出的字母个数可能小于字符串的长度。例如223,可能是BD也可能是AAD。

http://topic.csdn.net/t/20061227/16/5259955.html上有讨论。

 

方法1:(递归DFS)

         本题除去说如何判断什么样的单词是一个有意义的单词这个细节不谈(后文中说要先构造一个字典)。那么问题就转化为如何生成所有可能的字符单词。比如输入123,要生成所有的可能的“单词”:#AD,#AE,#AF,#BD,#BE,#BF,#CD,#CE,#CF。

         这是一种全排列的输出方式,如果从解答树上就更易看出来了:

                                                                                    23

                                                                              /       |       \

                                                                          (A         B         C)

                                                                       /   |   \    /  |  \     /  |  \

                                                                    (D  E  F) (DEF) (D  E  F)

       所以最适宜用DFS:

代码:

#include "stdafx.h"
#include<iostream>
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<Windows.h>
using namespace std;
//定义电话号码长度
#define MAX 20
//定义数字对应的字符
char c[10][10]=
{
 "@",//0  没有的就用@代替,方便看清楚
 "#",//1
 "ABC",//2
 "DEF",//3
 "GHI",//4
 "JKL",//5
 "MNO",//6
 "PQRS",//7
 "TUV",//8
 "WXYZ"//9
};
//定义按键的可能字符长度
int total[10]=
{
 1,1,3,3,3,3,3,4,3,4
};

//电话号码
char number[MAX];
int number_len;
int answer[MAX];//存放位置
void print()
{
 for(int i=0;i<number_len;i++)
 {
  cout<<c[number[i]-'0'][answer[i]];
 }
 cout<<endl;
}
//level表示循环的层次,号码的位数
//第level个数字
void dfs(int level)
{
 //终止情况
 if(level==number_len)
 {
  print();
  return ;
 }
    
 //该数字是:
 int num=number[level]-'0';
 for(int i=0;i<total[num];i++)
 {
  //对应answer位置赋值
  answer[level]=i;
  dfs(level+1);
 }
}

int _tmain(int argc, _TCHAR* argv[])
{
 while(cin>>number)
 {
  number_len=strlen(number);
  //第0个数字
  dfs(0);
  
 }
 ::system("pause");
 return 0;
}

 

方法2:(非递归 神奇的双重while循环)

注:显然可以利用这种方法,打印出任意一个N维数组的任意组合。
我的理解:

          这段代码虽然很精妙,但是要构造出来有点困难,并且理解起来也不好理解,有这个时间的话,还不如直接dfs,因为实际在程序的运行都是一样的,没有必要用巧妙来代替代码的速度,除非这个方案很常用,或者高效。让我想起了外星人写的求PI程序。

 核心:

          参见书本P217。

代码:

 

#include "stdafx.h"
#include<iostream>
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<Windows.h>
using namespace std;
//定义电话号码长度
#define MAX 20
//定义数字对应的字符
char c[10][10]=
{
 "@",//0  没有的就用@代替,方便看清楚
 "#",//1
 "ABC",//2
 "DEF",//3
 "GHI",//4
 "JKL",//5
 "MNO",//6
 "PQRS",//7
 "TUV",//8
 "WXYZ"//9
};
//定义按键的可能字符长度
int total[10]=
{
 1,1,3,3,3,3,3,4,3,4
};

//电话号码
char number[MAX];
int number_len;
int answer[MAX];//存放位置


int _tmain(int argc, _TCHAR* argv[])
{
 while(cin>>number)
 {
  number_len=strlen(number);

  while (true)   
  {   
   int k = number_len - 1;   
   //一次循环一次从第k个键向前移动一位   
   while (k >= 0)   
   {   
    for (int i = 0; i < number_len; i++)   
     cout << c[number[i]-'0'][answer[i]] << " ";   
    cout << endl;   
    if (answer[k] < total[number[k]-'0'] - 1)   
    {   
     //第k个键移动   
     answer[k]++;  

     break; //这里只要有一个键的一个位置发生一次变化,就退出,打印一次。   
    }   
    else  
    {   
     //第k个键移动完毕,回到0,开始遍历上一个键。   
     //此时,继续内部循环。下次循环,处理上一个键。   
     answer[k] = 0;   
     k--;   
    }
   }   
   if (k < 0)   
    break;   
  }   
 }
  ::system("pause");
  return 0;
}

 

上面的部分转自:http://hi.baidu.com/silverxinger/blog/item/9321dd7aa9d2c4290cd7dafe.html

 

分享到:
评论
1 楼 chriszeng87 2011-10-02  
第一题的答案:先拿3个,然后他拿的一堆中如果剩下的大于2个,你就跟他一样拿另一堆相同的个数,如果剩余1个,你就把另一堆全拿走,如果剩余0个(就是拿走了其中一堆),你就拿的剩一个

相关推荐

    很全面的EMC 面试试题

    为什么要对产品做电磁兼容设计? 答:满足产品功能要求、减少调试时间,使产品满足电磁兼容标准的要求,使产品不会对系统中的其它设备产生电磁干扰。

    EMC笔试题和面试题

    EMC公司08年的笔试面试题,一个学生的切身检验分享

    EMC 面试题 笔试题 面试经验 知识树

    NULL 博文链接:https://woshizn.iteye.com/blog/1735237

    EMC 面试笔试必备.doc

    电磁兼容面试笔试试题 面经 针对互联网大厂硬件就业必备 EMC面试笔试必备 硬件电磁兼容 电源电磁敏感 电路设计

    EMC 面试笔试必备

    EMC的一些基础知识, EMC 面试笔试必备,可以参考

    EMC EMI 资料 200+篇合集

    EMC面试题.txt emc题库 绿色是答案.doc EMC风险评估.ppt EMC(合同能源管理)市场化节能机制研究.doc EMI EMC设计秘籍.doc EMI & ESD 初解.ppt EMI 3410-VM UV胶资料.pdf EMI Filter设计技术.pdf EMI 测试基本 知识...

Global site tag (gtag.js) - Google Analytics