1.重载赋值运算符函数:(具体见代码)

//普通做法
CMyString& CMyString::operator=(const CMyString& str)
{
if (this == &str)
return *this; delete[] m_Pdata;
m_Pdata = new char[strlen(str.m_Pdata)+];
strcpy(m_Pdata,str.m_Pdata); return *this;
} //更加安全的做法,普通做法在new内存不足情况下,已经将原值delete
CMyString& CMyString::operator=(const CMyString& str)
{
if (this != &str)
{
CMyString strTemp(str); char* temp = str.m_Pdata;
//通过strTemp的析构函数delete掉原值
strTemp.m_Pdata = m_Pdata;
m_Pdata = temp;
} return *this;
}

2.替换字符串中的空白字符

瞎了,做了一遍结果还是出错。。。确实要多练练

class Solution {
public:
//length为数组容量
void replaceSpace(char *str,int length) { if(length<=||str==NULL) return; int i=,n_blank=,n_str=,n_strlength=;
while(str[i]!='\0'){
++n_str; if(' '==str[i])
++n_blank; ++i;
} n_strlength=n_str+n_blank*;
if(n_strlength>length) return; int n1=n_str,n2=n_strlength;
while(n1>=&&n2>n1){
if(str[n1]==' '){
str[n2--]='';
str[n2--]='';
str[n2--]='%';
}else{
str[n2--]=str[n1];
} --n1;
}
}
};

3.使用两个栈模仿队列

class Solution
{
public:
void push(int node) {
stack1.push(node);
} int pop() {
int temp; if(stack2.size()<=){
while(stack1.size()>){
temp=stack1.top();
stack2.push(temp);
stack1.pop();
}
} if(stack2.size()<=)
return ; temp=stack2.top();
stack2.pop();
return temp;
} private:
stack<int> stack1;
stack<int> stack2;
};

4.改进的斐波那契数列

class Solution {
public:
int Fibonacci(int n) { if(n<=) return ; if(==n||==n) return ; long long n1=,n2=,n3=;
for(int i=;i<n;i++){
n3=n1+n2;
n1=n2;
n2=n3;
}
return n3;
}
};

5.实数的整数次方

class Solution {
public:
double Power(double base, int exponent) { //防止0作为底数
if(equal(base,0.0)){
if(==exponent) return 1.0;
else return 0.0;
} //针对0次方做的特殊处理
if(==exponent) return 1.0;
else if(==exponent) return base; double res;
bool sign=exponent<?true:false; if(sign){
return 1.0/PowerD(base,-*exponent);
}else{
return PowerD(base,exponent);
}
} bool equal(const double &a,const double &b){
if(fabs(a-b)<1e-)
return true;
return false;
} double PowerD(double base,int exponent){ if(==exponent) return base;
else if(==exponent) return 1.0; double res=PowerD(base,exponent/);
res*=res;
if(exponent&0x01==){ //判断是否是奇数次方
res*=base;
}
return res;
}
};

6.求链表的倒数第k个节点

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(NULL==pListHead||k==) return NULL; int i=k;
ListNode *t1=pListHead,*t2=pListHead; while(i!=&&t1!=NULL){
--i;
t1=t1->next;
} if(i!=) return NULL; while(t1!=NULL){
t1=t1->next;
t2=t2->next;
}
return t2;
}
};

7.包含min函数的栈

class Solution {
public:
void push(int value) { m_data.push(value); if(m_min.size()==){
m_min.push(value);
}else{
if(value<m_min.top())
m_min.push(value);
else m_min.push(m_min.top());
}
}
void pop() {
if(m_data.size()>){
m_data.pop();
m_min.pop();
}
}
int top() {
if(m_data.size()>)
return m_data.top();
}
int min() {
if(m_min.size()>)
return m_min.top();
} private:
stack<int> m_data;
stack<int> m_min;
};

8.给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。

vector<int> multiply(const vector<int>& A) {

        int i,len=A.size(),temp=;
vector<int> res;
if(len<=) return res; res.push_back();
for(i=;i<len;i++){
res.push_back(res[i-]*A[i-]);
} for(i=len-;i>=;i--){
temp*=A[i+];
res[i]*=temp;
} return res;
}

此题没怎么注意代码的鲁棒性,后续可以补充。

9.一个链表中包含环,请找出该链表的环的入口结点。

ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead==NULL) return NULL; //找到环中节点
ListNode *p1=MeetListNode(pHead),*p2;
if(p1==NULL) return NULL; //计算链表中环的节点个数
int i,n=;
p2=p1->next;
while(p2!=p1){
++n;
p2=p2->next;
} //寻找链表中环的入口节点
p1=pHead;p2=pHead;
for(i=;i<n;i++){
p1=p1->next;
}
while(p1!=p2){
p1=p1->next;
p2=p2->next;
}
return p1;
} ListNode* MeetListNode(ListNode* pHead){ ListNode *p1=pHead->next,*p2=pHead;
if(pHead==NULL||p1==NULL||p1->next==NULL) return NULL; p1=p1->next;
while(p1!=p2){ p2=p2->next; p1=p1->next;
if(p1->next==NULL){
return NULL;
}else{
p1=p1->next;
}
}
return p1;
}

这道题有更加快捷优化的做法,后续做更新。这里只是将书本上的思路进行阐述。

10.在一个长度为n的数组里的所有数字都在0到n-1的范围内。

数组中某些数字是重复的,但不知道有几个数字是重复的。

也不知道每个数字重复几次。请找出数组中任意一个重复的数字。

例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。

bool duplicate(int numbers[], int length, int* duplication) {

        if(NULL==numbers||length<=) return NULL;

        int i,temp;
for(i=;i<length;i++){ //对数据的正确性进行检测
if(numbers[i]<||numbers[i]>length-)
return NULL;
} for(i=;i<length;i++){
while(numbers[i]!=i){
if(numbers[i]==numbers[numbers[i]]){
*duplication=numbers[i];
return true;
} //进行数值交换
temp=numbers[i];
numbers[i]=numbers[temp];
numbers[temp]=temp;
}
} return false;
}

这道题还是比较绕,不能熟练掌握。

11.第一个只出现一次的字符

此题其实比较简单,但是要知道ASCII码共有256个。其实不知道也无妨,将hashtable设置较大即可。

期望于一个循环解决问题,是可以的,但是在面试的过程中,最重要的是解决题目,进而进行优化。

class Solution {
public:
int FirstNotRepeatingChar(string str) { int len=str.length();
if(==len)
return -;
else if(==len){
return ;
} const int size=;
unsigned int i,hashtable[size]={}; for(i=;i<len;++i){
++hashtable[str[i]];
} for(i=;i<len;++i){
if(==hashtable[str[i]])
return i;
} return -;
}
};

12.数组中只出现一次的数字

此题可以扩展范围,比如字符之类的,总之方法如果不是看书,蛮难想到的

class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { int len=data.size();
if(len<)
return;
else if(==len&&data[]!=data[]){
*num1=data[];
*num2=data[];
return;
} int i,n=,temp=data[],res;
for(i=;i<len;i++){
temp=temp^data[i];
} //寻找二进制中初始为1数字
while(!(temp&0x01)&&(n<*sizeof(int))){
++n;
temp=temp>>;
} *num1=;*num2=;
for(i=;i<len;++i){ res=(data[i]>>n)&0x01; if(res){
*num1^=data[i];
}else{
*num2^=data[i];
}
} return;
}
};

剑指offer习题集的更多相关文章

  1. 剑指offer习题集2

    1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...

  2. 剑指offer习题集1

    1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...

  3. 剑指Offer面试题:1.实现Singleton模式

    说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...

  4. 剑指Offer面试题:14.链表的倒数第k个节点

    PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...

  5. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  6. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

  7. 剑指 Offer 题目汇总索引

    剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格              ...

  8. 面试题目——《剑指Offer》

    1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...

  9. 剑指Offer:面试题20——顺时针打印矩阵(java实现)

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...

随机推荐

  1. python数据库操作pymysql

    安装数据库: pip3 install pymysql 进行数据库的更新.插入.查询等操作: #!/usr/bin/python3.4 # -*- coding: utf-8 -*- #------- ...

  2. js实现复选框的全选、全不选、反选

    js中实现复选框的全选,全不选以及反选,分为两种情况: (1)选中“请选择”前面的复选框实现全选,不选中“请选择”前面的复选框实现全不选 <!DOCTYPE html PUBLIC " ...

  3. python中保留两位小数

    今天写程序的时候碰到了一个问题关于如何控制浮点数只显示小数点后两位,正常的想法是用round函数,例如 round(a, 2),但是在面对下面的问题时候round就不太好用了 >>> ...

  4. BlueStacks 设置代理服务器 Proxifier指定任意程序的代理服务器

    详见地址: http://www.ccproxy.com/proxifier-tou-ming-dai-li.htm BlueStacks如何使用代理服务器 http://www.360doc.com ...

  5. centos6.5 安装iptables

    阿里云默认是没有安装iptables 安装 yum install -t iptables yum install iptables-services 检查iptables服务的状态 service ...

  6. css3 文字闪动效果

    <div id="container"> 这里查看“<span class="blink">闪烁效果</span>”,ENj ...

  7. VT100字体

    自从接触LINUX之后,VT100是我最喜欢的终端字体,当然它也是SecureCRT的默认字体.真实文件全名,VT100.FON  总共才44KB大小. 字体安装:直接放入C:\Windows\Fon ...

  8. 使用 Entity Framework

    ORM 和 EF 当我们要开发一个应用程序,就要考虑怎样展示数据,怎样持久化数据.考虑这个问题时我们所要关心的东西,最重要的莫过于程序的性能.开发的简易性和代码的可维护.可扩展性. 持久化(Persi ...

  9. Apriori 关联算法学习

    1. 挖掘关联规则 1.1   什么是关联规则 一言蔽之,关联规则是形如X→Y的蕴涵式,表示通过X可以推导“得到”Y,其中X和Y分别称为关联规则的先导(antecedent或left-hand-sid ...

  10. BIP_开发案例06_以RB.RDF为数据源BIP.RTF为模板的简单例子(案例)

    2014-05-31 Created By BaoXinjian