近期笔试

来源:互联网 发布:竞品调研报告知乎 编辑:程序博客网 时间:2024/04/30 02:36

1、N条直线最多将平面分成多少部分。

2、有2006个硬币,正面图案全部朝上,依其序号排列从1至2006。
第1次翻转所有序号为1的倍数的硬币;
第2次翻转所有序号为2的倍数的硬币;
第3次翻转所有序号为3的倍数的硬币;
.......
第2006次翻转所有序号为2006的倍数的硬币。
这时,正面朝下的硬币还有几个?

答案:是1-2006之间的完全平方数,
数的奇偶性,可以发现这个硬币号码的约数有几个,就会被翻动几次,翻动奇数次,硬币正面向下,只有完全平方数的约数是奇数个,所以找到1-2006之间的完全平方数即可。

3、已知两个数的异或与和,可以唯一确定这对数吗?

4、二叉树前序后序可以确定一个二叉树吗?

5、字符串所有不重复排列。

#include "stdafx.h"

inline void Swap(char& a, char& b)  

    char temp = a;  
    a = b;  
    b = temp;  
}

void Perm(char list[], int k, int m)  
{
 /*生成list [k:m ]的所有排列方式*/ 
    int i;  
    if (k == m) 
    { 
        for (i = 0; i <= m; i++)  
            putchar(list[i]);  
        putchar('\n');  
    }  
  /* list[k:m ]有多个排列方式 
   * 递归地产生这些排列方式
   */ 
 else  
        for (i=k; i <= m; i++) 
        {  
            Swap (list[k], list[i]);  
            Perm (list, k+1, m);  
            Swap (list [k], list [i]);  
        }  
}

int _tmain(int argc, _TCHAR* argv[])
{
 char s[] = "abcd"; 
    Perm(s,0,3); 

 return 0;
}

6、计算sizeof的结果

基本数据类型的sizeof    这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型,由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注意,尽量不要在这方面给自己程序的移植造成麻烦。    一般的,在32位编译环境中,sizeof(int)的取值为4。

 

对于64位平台上各种数据类型分别占用多少字节,存在一些疑问,所以用C/C++中的sizeof分别在这两种平台上进行了测试。运行结果如下:(分别用蓝色和红色标记了两者的差异)——————————————————————————机器平台:X86_64 处理器操作系统:Red Hat 4.1.2-14编译器: gcc version 4.1.2 20070626Size of char is:                                   1Size of unsigned char is:                     1Size of signed char is:                  1Size of int is:                                    4Size of short is:                                2Size of long is:                                  8Size of long int is:                             8Size of signed int is:                           4Size of unsigned int is:                       4Size of unsigned long int is:                8Size of long long int is:                       8Size of unsigned long long is:              8Size of float is:                    4Size of double is:                 8Size of long double is:          16Size of (void *) is:           8Size of (char *) is:           8Size of (int *) is:             8Size of (long *) is:           8Size of (long long *) is:   8Size of (float *) is:          8Size of (double *) is:              8——————————————————————————机器平台: X86_32 处理器操作系统:  Windows XP SP2 编译器:    VS2005自带的C++编译器Size of char is:                            1Size of unsigned char is:              1Size of signed char is:           1Size of int is:                       4Size of short is:                    2Size of long is:                     4Size of long int is:                4Size of signed int is:             4Size of unsigned int is:          4Size of unsigned long int is:         4Size of long long int is:                8Size of unsigned long long is:       8Size of float is:                    4Size of double is:                 8Size of long double is:          8Size of (void *) is:          4     Size of (char *) is:          4Size of (int *) is:             4Size of (long *) is:          4Size of (long long *) is:   4Size of (float *) is:          4Size of (double *) is:       4

 

指针变量的sizeof 学过数据结构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位)数组的sizeof 数组的sizeof值等于数组所占用的内存字节数,如:char a1[] = "abc";int a2[3];sizeof( a1 ); // 结果为4,字符 末尾还存在一个NULL终止符sizeof( a2 ); // 结果为3*4=12(依赖于int) 一些朋友刚开始时把sizeof当作了求数组元素的个数,现在,你应该知道这是不对的,那么应该怎么求数组元素的个数呢Easy,通常有下面两种写法:int c1 = sizeof( a1 ) / sizeof( char ); // 总长度/单个元素的长度int c2 = sizeof( a1 ) / sizeof( a1[0] ); // 总长度/第一个元素的长度 写到这里,提一问,下面的c3,c4值应该是多少呢void foo3(char a3[3]){ int c3 = sizeof( a3 ); // c3 ==}void foo4(char a4[]){ int c4 = sizeof( a4 ); // c4 ==} 也许当你试图回答c4的值时已经意识到c3答错了,是的,c3!=3。这里函数参数a3已不再是数组类型,而是蜕变成指针,相当于char* a3,为什么仔细想想就不难明白,我们调用函数foo1时,程序会在栈上分配一个大小为3的数组吗不会!数组是“传址”的,调用者只需将实参的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为4。

 

 

1.常规char  str1[] = “Hello” ;char  str2[5] = {'H','e','l','l','o'};char  str3[6] = {'H','e','l','l','o','\0'};char   *p1 = "Hello";char  *p2[]={"hello","world"}; int     n = 10;int    *q = &n;sizeof (str1 ) = 6    (自动加了'\0')  strlen (str1 ) = 5    (字符串的长度)  sizeof (str2 ) = 5    (字符数组的大小)strlen (str2)  = 未知 (该字符串缺少结束符'\0')sizeof (str3)  = 6    (字符数组的大小)strlen (str3)  = 5    (该字符串的长度为5)sizeof ( p1 ) =  4    (p1是一个指针,大小为4)sizeof ( p2 ) =  8    (p2是长度为2的字符串数组)sizeof ( n ) =   4    (整型大小为4)sizeof ( q ) =   4    (q是一个指针,大小为4)2.动态分配内存int *p = (int *)malloc( 100 );sizeof ( p ) = 4      (p是一个指针,大小为4)3.函数参数void Function1( char p[],int num ){    sizeof ( p ) = 4  (数组在做为函数参数时均化为指针)}void Function2( int p[],int num ){    sizeof ( p ) = 4  (数组在做为函数参数时均化为指针)}4.多重继承class A{};class B{};class C:public A,public B{};class D:virtual public A{};class E:virtual public A,virtual public B{};sizeof ( A ) = 1      (空类大小为1,编译器安插一个char给空类,用来标记它的每一个对象)sizeof ( B ) = 1      (空类大小为1,编译器安插一个char给空类,用来标记它的每一个对象)sizeof ( C ) = 1      (继承或多重继承后空类大小还是1)sizeof ( D ) = 4      (虚继承时编译器为该类安插一个指向父类的指针,指针大小为4)sizeof ( E ) = 8      (指向父类A的指针与父类B的指针,加起来大小为8)5.数据对齐类(或结构)的大小必需为类中最大数据类型的整数倍.CPU访问对齐的数据的效率是最高的,因此通常编译浪费一些空间来使得我们的数据是对齐的
 
整个结构体的总大小为最宽基本类型成员大小的整数倍。对齐模数的选择只能是根据基本数据类型,所以对于结构体中嵌套结构体,只能考虑其拆分的基本数据类型。而对于对齐准则中的第2条,确是要将整个结构体看成是一个成员,成员大小按照该结构体根据对齐准则判断所得的大小。 类对象在内存中存放的方式和结构体类似,这里就不再说明。需要指出的是,类对象的大小只是包括类中非静态成员变量所占的空间,如果有虚函数,那么再另外增加一个指针所占的空间即可。 VC中可用#pragma   pack(k)(k为对齐模数)来设置编译器的内存对齐模数。 

class A{public:    int a;};class B{public:    int a ;    char b;};class C{public:    int a ;    char b;    char c;};sizeof(A) = 4  (内含一个int ,所以大小为4)sizeof(B) = 8   (int为4,char为1,和为5,考虑到对齐,总大小为int的整数倍即8)  sizeof(C) = 8   (同上)6.函数与虚函数编译器为每个有虚函数的类都建立一个虚函数表(其大小不计算在类中),并为这个类安插一个指向虚函数表的指针,即每个有虚函数的类其大小至少为一个指针的大小4class A{public:    int a;    void Function();};class B{public:    int a;    virtual void Function();};class C:public B{public:    char b;};class D:public B{public:    virtual void Function2();};class E{public:    static void Function();};sizeof (A) = 4   (内含一个int,普通函数不占大小)sizeof (B) = 8   (一个int ,一个虚函数表指针)sizeof (C) =12   (一个int ,一个虚函数表指针,一个char ,再加上数据对齐)sizeof (D) = 8   (一个int ,一个虚函数表指针,多个虚函数是放在一个表里的,所以虚函数表指针只要一个就行了)sizeof (E) = 1   (static 函数不占大小,空类大小为1)7.父类的私有数据虽然在子类中不可用,但是是可见的,因此私有的数据还是要占子类的大小class A{private:    int a;};class B:public A{};sizof(B) = 4;    (内含一个不可用的父类的int)8.大概就这么多了吧,想到再加吧。虚函数,多重继承,空类是比较复杂的,大家大概记住知道就行了  Sizeof与Strlen的区别与联系(转)1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof是算符,strlen是函数。 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如: short f();printf("%d\n", sizeof(f()));输出的结果是sizeof(short),即2。 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。 5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 char str[20]="0123456789";int a=strlen(str); //a=10;int b=sizeof(str); //而b=20;6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。 7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 归还全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如: fun(char [8])fun(char [])都等价于 fun(char *) 在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去 fun(unsiged char *p1, int len){  unsigned char* buf = new unsigned char[len+1]  memcpy(buf, p1, len);}

 

Sizeof与Strlen的区别与联系(转)1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof是算符,strlen是函数。 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,其结果是函数返回类型的大小,函数并不会被调用,比如: short f();printf("%d\n", sizeof(f()));输出的结果是sizeof(short),即2。 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。 5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 char str[20]="0123456789";int a=strlen(str); //a=10;int b=sizeof(str); //而b=20;6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。 7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 归还全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如: fun(char [8])fun(char [])都等价于 fun(char *) 在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去 fun(unsiged char *p1, int len){  unsigned char* buf = new unsigned char[len+1]  memcpy(buf, p1, len);}世上编译器林林总总,但作为一个规范,它们都会保证char、signed char和unsignedchar的sizeof值为1,毕竟char是我们编程能用的最小数据类型。7、宏定义求最大值、最小值、两数交换#define   MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )#define   MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )#define   SWAP(a,b) (a)^=(b)^=(a)^=(b)这个宏考虑到类型了,很好用~~#define SWAP(type,a,b) {type tmp; tmp=a; a=b; b=tmp;}#include int main(){ double a = 10.0, b = 20.0; SWAP(double, a, b); printf("%f %f\n",a,b); int c = 10, d= 28; SWAP(int, c, d); printf("%d %d\n",c,d); return 0;}下面这个在宏定义里没有考虑类型,但是,a  b 之间交换数值的时候,没有用到临时变量,同种类型的变量在运算~#define SWAP(a,b) {a=a+b; b=a-b; a=a-b;}#include int main(){ double a=10.0, b=20.0; SWAP(a,b); printf("%f %f\n",a,b); int c = 10, d= 28; SWAP(c,d); printf("%d %d\n",c,d); return 0;}用内存拷贝的方法,貌似有点复杂:#define SWAP(a, b)\{\    int size = sizeof(a);\    char* temp = (char*)malloc(size);\    memcpy(temp, &a, size);\    memcpy(&a, &b, size);\    memcpy(&b, temp, size);\    free(temp);\}#include  #include #include int main(){ double a=10.0, b=20.0; SWAP(a,b); printf("%f %f\n",a,b);  int c = 10, d= 28; SWAP(c,d); printf("%d %d\n",c,d); return 0;}
9、判断你的cpu采用的是little endian还是Big endian#includeint main(){short little = 0x1234;//printf("size of short: %d/n", sizeof(short));//先直观的看一下char* test =(char *) &little;printf("low address store :> %#2x/n",*test);printf("high address store :> %#2x/n",*(test+1) ); //判断到底是低字节序还是高字节序char cnum[2] = {0x01, 0x00};if( 1 == *(short *)cnum){ printf("your cpu is Little endian!/n");}else{ printf("your cpu is Big endian!/n");}return 0;}10、连续整数之和为1000的共几组?4组(1)暴力破解(2)等差数列的公式11、Linux中查找文件中含某关键字的行的命令?grep
	
				
		
原创粉丝点击