几个很好的面试题

问题1

全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

答:    这是一个华为的面试题  看似简单  其实考点很多。首先,如果只是这样在头文件中单纯的定义全局变量,int g_var = 0;

那么多个C文件包含后肯定会出错,因为#include某个文件的本质其实是“复制”内容到当前文件 因此会造成重复定义的错误~

我下面说一下几种方法的优缺点

有一种做法是 把全局变量声明为static 让其拥有文件作用域  这样做可以消除重复定义的编译错误 但是 这样做 全局变量其实有了多份copy 也就是说 各个文件中的同名全局变量其实是不同的  其包含的值也不同   这个做法是绝对的自找bug型  想加班想疯了  建议不这么做

 

方法二  extern

在头文件中 为全局变量定义一个宏

#ifndef G_VAR
int g_var = 0;
#else
extern g_var;
#endif

这个做法在功能上能够解决重复定义的编译问题 也能保证 全局变量的唯一性

但是在工程中这个做法给项目维护性带来极大的灾难

因为所有的全局变量分散在不同的头文件中 无人能知究竟整个项目中有多少全局变量

方法三  对方法二进行工程改进

在项目中 专门建立名叫 global_var.h 和 global_var.c 的文件  将所有的全局变量全部定义在 global_var.c 中

在头文件中global_var.h中 只有

extern g_var;

 

采用方法三后  可以直接搜索 global_var.h 这个字符串 那么所有使用全局变量文件都会搜索出来

通过global_var.c文件可以知道  整个项目中究竟定义了多少全局变量

在C项目中 全局变量使用数目的多少 在一定意义上能反映整个项目的维护性  全局变量使用越多 后期越来维护

 

第一个题

编写函数判断一个数是否为2的n次幂

bool isPow2(unsigned int x);

bool isPow2(unsigned int x)
{
    return !(x & (x - 1));
}

这个想法很简单 如果x为2的n次幂  那么必然的在二进制上  这32位中有且仅有一位为1  x-1必然导致低n-1位由0变为1   两者相与就只有0了,因为函数原型返回值为bool

所以这个就够了 但是如果是求出是2的多少次幂 那么又怎么写呢

我的意思是
实现函数 int nPow2(unsigned int x)

nPow2(4) ==> 2
nPow2(8) ==> 3
nPow2(128) ==> 7

 

原理简单 看看我的方法

// 返回一个数的2次幂
int nPow2(unsigned int x)
{
    int ret = 0xFFFFFFFF;
   
    if( isPow2(x) )
    {
        ret = 0;
       
        while( x ? (ret++, (x = x >> 1)) : 0 );
       
        ret--;
    }
   
    return ret;
}

 

下一个问题

数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:

int do_dup(int a[],int N);

我得说的是,这个题目是求重复的数,为什么很多同学,都用异或呢》?

int do_dup(int a[],int N)    //未经调试
{
      int sun = 0;
      int i = 0;
     
      for(i=0; i<N; i++)
      {
        sum += a[i];
      }
     
      return sum - ((N - 1) * N / 2);
}

下一题

判断数组a中存储的元素是否对称
bool is_symmetry(int a, int n);

int a[] = {1, 2, 5, 2, 1};
is_symmetry(a, 5); ==> true

int a[] = {1, 2, 5, 2, 3};
is_symmetry(a, 5); ==> false

int is_symmetry(int a[], unsigned int n)
{
  return ((n == 0) || (n == 1)) ? 1 : ((a[0] == a[n - 1]) && is_symmetry(a + 2, n - 2));
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值