`
v5qqbrowser
  • 浏览: 357483 次
文章分类
社区版块
存档分类
最新评论

近期笔试

 
阅读更多

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 20070626

Size of char is:                                   1

Size of unsigned char is:                     1

Size of signed char is:                  1

Size of int is:                                    4

Size of short is:                                2

Size of long is:                                  8

Size of long int is:                             8

Size of signed int is:                           4

Size of unsigned int is:                       4

Size of unsigned long int is:                8

Size of long long int is:                       8

Size of unsigned long long is:              8

Size of float is:                    4

Size of double is:                 8

Size of long double is:          16

Size of (void *) is:           8

Size of (char *) is:           8

Size of (int *) is:             8

Size of (long *) is:           8

Size of (long long *) is:   8

Size of (float *) is:          8

Size of (double *) is:              8

——————————————————————————

机器平台: X86_32 处理器

操作系统:  Windows XP SP2 

编译器:    VS2005自带的C++编译器

Size of char is:                            1

Size of unsigned char is:              1

Size of signed char is:           1

Size of int is:                       4

Size of short is:                    2

Size of long is:                     4

Size of long int is:                4

Size of signed int is:             4

Size of unsigned int is:          4

Size of unsigned long int is:         4

Size of long long int is:                8

Size of unsigned long long is:       8

Size of float is:                    4

Size of double is:                 8

Size of long double is:          8

Size of (void *) is:          4     

Size of (char *) is:          4

Size of (int *) is:             4

Size of (long *) is:          4

Size of (long long *) is:   4

Size of (float *) is:          4

Size 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.函数与虚函数
编译器为每个有虚函数的类都建立一个虚函数表(其大小不计算在类中),并为这个类安插一个指向虚函数表的指针,即每个有虚函数的类其大小至少为一个指针的大小4
class 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和unsigned
char的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 <stdio h="">
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 <stdio h="">
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, &amp;a, size);\
    memcpy(&amp;a, &amp;b, size);\
    memcpy(&amp;b, temp, size);\
    free(temp);\
}

#include <stdio h=""> 
#include <stdlib h="">
#include <string h="">
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;
}</string></stdlib></stdio></stdio></stdio>

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


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics