笔试2:禾赛科技
静态局部变量概念。
继承体系中派生类构造函数的调用,虚函数机制。
数组名取地址的意义以及指针常量和常量指针的概念。
指针常量指的是指针指向的内容不可变;常量指针指的是指针本身不可变。
解释:(int)(pf[8])(double *);
自定义string类,并实现构造函数、赋值运算符函数(要求能够输入任意二进制字符,即非法字符串和‘\0’)
class MyString
{
public:
MyString();
MyString(const char *s); //构造函数
MyString(const char *s, int l);
MyString& operator = (const MyString &st); //赋值运算符
friend ostream&operator<<(ostream &os,const MyString&st){os<<st.str;return os;}
private:
char *str; //字符串
int len; //字符串长度
}
MyString::MyString(const char *s)
{
len = strlen(str);
str = new char[len+1];
strcpy(str,s);
}
MyString::MyString(const char *s, int l)
{
len = l;
str = new char[len + 1];
for (int i = 0; i < l + 1; ++i)
{
str[i] = s[i];
}
}
MyString& MyString::operator=(const MyString & st)
{
if(this==&st)
return *this;
delete []str; //清空内存
len = st.len;
str = new char[len+1];
strcpy(str,st.str);
return *this;
}关于\0的讨论:
从const char*创建string时,指针指向的数组必须以空字符结尾,拷贝操作遇到空字符时停止。如果传递给构造函数一个计数值,数组就不必以空字符结尾。
标准string的构造函数string::basic_string(const char *_Ptr,size_t _Count);可以实现如下操作:
char *s = "abcde\0fg"; string str(s,9); cout<<str<<endl; //输出:abcde fg
然而上面重载构造函数,虽然能够将"abcde\0fg"传递给str成员,但是重载的<<又不能像标准string一样直接输出。
vector容器自定义排序算法,相关结构体如下:
struct Student{
string name;
string class;
bool male;
double score;
};
extern vector<Student>vecStudent; //所有学生信息要求相同班级同学在一起;每个班中女在前男在后,按照分数降序排序,如果分数相同则按照姓名首字母字典序排列。完成排序后打印前n个同学的姓名和分数。
小端电脑,将一个浮点数按照大端模式放在buffer中发送出去,实现转换函数。
unsigned char buffer[4]={0};
void convert(float a,unsigned char buffer[]);约瑟夫环问题。
唔,剑指offer用std::list的方式在牛客里面超时了。
int ysf(int n, int m)
{
if (n < 0 || m < 1)
return 0;
list<int>st;
for (int i = 1; i <= n; ++i)
st.emplace_back(i);
auto iter = st.begin();
while (st.size() > 1)
{
for (int i = 1; i < m; i++)
{
iter++;
if (iter == st.end())
iter = st.begin();
}
iter = st.erase(iter);
if (iter == st.end())
iter = st.begin();
}
return st.back();;
}安静的自己构造的循环单链表:
int ysf(int n, int m) {
ListNode *p=new ListNode(1);
ListNode *q=p;
for(int i=2;i<=n;++i)
{
ListNode *r = new ListNode(i);
q->next=r;
q=r;
}
q->next=p; //此时,构成环形链表
while(p->next!=p)
{
for(int i=1;i<m;++i)
{
q=p; //单链表,需要记录前一个结点
p=p->next;
}
q->next=p->next; //删除结点
p=q->next;
}
return p->val;
}
查看15道真题和解析