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. fastjson生成和解析json数据

    本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...

  2. jQuery Mobile_事件

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. jquery点击改变class并toggle

    <html> <head> <meta charset="utf-8"> <title></title> <scr ...

  4. tnsnames linux找的位置顺序

    In Sue’s article, it states that SQLDeveloper looks for a tnsnames.ora in the following places in th ...

  5. 阿里云centos增加swap(虚拟内存)

    我的阿里云服务器默认是没有配swap交换文件. 创建swap根目录 mkdir /swap 创建swap dd if=/dev/zero of=/swap/swap bs=1024 count=102 ...

  6. http meta

    定义和用法 <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. <meta> 标签位于文档的头部,不包含任 ...

  7. CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)

    点评:Media Queries这功能是非常强大的,他可以让你定制不同的分辨率和设备,并在不改变内容的情况下,让你制作的web页面在不同的分辨率和设备下都能显示正常,并且不会因此而丢失样式   Med ...

  8. Hibernate3回顾-1-部署

    web备份版本,详见doc版本. 一.背景(部署简单回顾) 我们知道,一个Hibernate快速上手的简单流程是这样. 1引入对应jar包. 中间涉及log4的jar包和配置,略. 2 实体类 pac ...

  9. 剑指offer系列34----按之字形顺序打印二叉树

    [题目]请实现一个函数按照之字形打印二叉树, * 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印, * 其他行以此类推. 未优化,不是最优解,博主用的是队列 ...

  10. JavaScript权威指南 第七章 数组

    主要介绍一下数组方法 1.Join() Array.join()方法将数组中所有元素都转换为字符串并连接在一起,返回最后生成的字符串. 可以指定一个可选的字符串在生成的字符串中来分隔数组的各个元素.默 ...