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, &a, size);\
memcpy(&a, &b, size);\
memcpy(&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
分享到:
相关推荐
C++面试题笔试题C++ 数据结构算法笔试题资料合集: 50个C、C++面试题.pdf C++ 数据结构、算法笔试题.docx C++基础面试题.docx C++开发工程师面试题库.docx ...近期出现的C++面试题整理(附详细答案).docx
中国银行面试笔试宝典 包含近期面试笔试题目 以及 相关金融等知识和面试经验谈。。。
华为项目管理新增笔试及面试,整理了近期的笔试考试题目经相关答案分享给大家。
互联网校招题库资料笔试面试真题具体面试问题回答技巧腾讯阿里培训资料: C++面试题笔试题 C语言 IQ智力面试题笔试题 JAVA笔试面试资料 NET面试题笔试题 ...近期出现的C++面试题整理(附详细答案).docx
本人收集了近期的部分Java面试题。其中有的题目确实蛮好的,希望能够对大家的学习有所帮助!!!
新近的青鸟笔试题 考试参考 北大青鸟和国家考试中心认证试题 易于打印成文件或 复制 粘贴 练习
Tencent笔试题收集,主要是针对近期的试题的汇总......
近期许多公司都要进行笔试了,HiAll在论坛上整理了名企的笔经,并汇总供大家下载,希望对大家的笔试能有所帮助。并祝福所有参加笔试的同学们一切顺利!
各大IT公司近期 c、c++ 数据结构方面的笔试试题,都是经典的题目,有答案。也有部分英文试题。
万达笔试题,这是本人亲自面试过的,近期的面试题目,看看吧,挺基础
深信服虚拟化近期考试题目,不保证全对,只有70%正确率
青岛阿朗近期校园笔试题目
中级java笔试题项目介绍 质量安全文章集锦 目录 Github-list - 作者:牛 -by SecWiki - 列出秒集合 - 万星名单 - 安全事件响应工具和资源的精选列表,旨在帮助安全分析师和 DFIR 团队。 - Android 安全相关资源的...
高级java笔试题 XPay个人收款支付系统 当前开源版本v2.0 作者亲自制作 项目已部署,在线Demo 本项目运行后效果: 本项目Swagger接口文档: 实际综合应用商城项目: v3.1版本已发布!支付宝微信官方接口 自动回调! v...
本人面试经验 ,很有用 经验之谈,面试,笔试,人力资源,近期总结
建立该项目的初衷是近期有很多同学面临此硕士项目的笔试和面试,希望此项目能够从解决面试这个点出发,将问题解决层面扩展到本科和硕士的各个课程,帮助学弟学妹们更好地适应罗兰大学的学习与生活. This repository ...
这里也会更新Chitty每次面试笔试后对自己的反思总结。这里还有对一些有趣问题的思考。 近期“补足短板计划”学习内容: CSS3 CSS在不同浏览器的兼容问题 设计模式 JS对一些数据结构的实现 学习永无止尽,此项目将会...