1. 程式人生 > >劍指Offer面試題1:賦值運算子函式

劍指Offer面試題1:賦值運算子函式

給類CMyString新增賦值運算子函式,初級做法如下:

#include<iostream>
#include<string.h>
using namespace std;

class CMyString{
	public:
		CMyString(const char *pData=NULL);
		~CMyString(void);
		CMyString& operator = (const CMyString &str);
		CMyString& operator = (const char *str);
		void show();
	private:
		char *m_pData;
	
};

CMyString::CMyString(const char *pData){
	if(pData == NULL){
		m_pData = new char[1];
		m_pData[0] = '\0';
		return;
	}
		
	m_pData = new char[strlen(pData)+1];
	memcpy(m_pData,pData,sizeof(pData));
}

void CMyString::show(){
	cout<<m_pData<<endl;
}

CMyString::~CMyString(void){
	delete []m_pData;
}

CMyString& CMyString::operator = (const CMyString &str){
	if(this == &str)  
        return *this;  
      
    delete []m_pData;  
    m_pData = NULL;   
      
    m_pData = new char[strlen(str.m_pData)+1];  
    strcpy(m_pData,str.m_pData);  
    return *this;  
}

CMyString& CMyString::operator = (const char *str){  
    if(str == NULL)  
        return *this; 
        
	delete []m_pData;
	m_pData = NULL;
	
    m_pData = new char[strlen(str)+1];  
    strcpy(m_pData,str); 
    return *this; 
} 



int main(){
	CMyString str1("love");
	str1.show();
	
	CMyString str2,str3;
	str3 = str2 = str1;
	str3.show();
	str2.show();
	
	CMyString str4;
	str4 = "haha";
	str4.show();

	CMyString str5("!!!");
	str5.show();
	
	return 0;
}

高階做法如下:

CMyString& CMyString::operator = (const CMyString &str){
	if(this != &str){
		CMyString strTmp(str);
		char *temp = strTmp.m_pData;
		strTmp.m_pData = m_pData;
		m_pData = temp;	
	}
	
	return *this;
}

相關推薦

offer-試題1運算子函式

如下為型別CMyString的宣告,請為該型別新增賦值運算子函式。 解析:給一個類進行運算子過載。 關鍵部分程式碼: CMyString& CMyString::operator =(const CMyString &str) { if(this == &str)

Offer試題1運算子函式

給類CMyString新增賦值運算子函式,初級做法如下: #include<iostream> #include<string.h> using namespace std; class CMyString{ public: CMyStrin

offer試題1運算子函式

//要寫一個賦值運算子函式,即過載賦值運算子,有兩種形式:類成員函式和友元函式;我們這裡用類成員函式的形式 #pragma once class CMyString { public: //CMy

offer:試題1運算符函數

void 面試題1 賦值運算 入參 vat strcpy 參數 urn char* 題目 如下為類型CMyString的聲明,請為該類型添加賦值運算符函數 class CMyString { public: CMyString(char* pData

Offer試題1運算子函式

// 面試題1:賦值運算子函式 // 題目:如下為型別CMyString的宣告,請為該型別新增賦值運算子函式。 class CMyString {        public:               CMyString(char* pData = nullptr);             

offer{試題32求從1到n的整數中1出現的次數}

思路:map.get獲得出現次數 import java.util.HashMap; public class Solution { public int FirstNotRepeatingChar(String str) { int len = str.length(); if(len =

Offer——試題31整數中1出現的次數

整數中1出現的次數(從1到n整數中1出現的次數) 題目:求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer

offer試題[32]1到n整數中1出現的次數

題目描述        求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後

leetcode 240. 搜尋二維矩陣 II【陣列】【Medium】&&Offer試題4二維陣列中的查詢

題目: 編寫一個高效的演算法來搜尋 m x n 矩陣 matrix 中的一個目標值 target。該矩陣具有以下特性: 每行的元素從左到右升序排列。 每列的元素從上到下升序排列。 示例: 現有矩陣 matrix 如下: [

offer 試題50字元流中第一個只出現一次的字元

題目描述:請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現一次的字元是"l"。 解法: 使用雜湊表occurance[256] ;  初始化o

offer 試題19正則表示式匹配

請實現一個函式用來匹配包括'.'和'*'的正則表示式。模式中的字元'.'表示任意一個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配 c

offer 試題20表示數值的字串

請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。 可以用A[.[B]][e|EC]或者.B[e|EC

offer 試題28對稱的二叉樹 c++

題目:請實現一個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。(要想象一下他的結構) 思路:遞迴判斷,左子樹的左子樹和右子樹的右子樹比較,左子樹的右子樹和右子樹的左子樹比較,若相等則是,否則不是。 class Solution { pub

offer 試題49醜數

 題目:把只包含質因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。 思路:用一個數組,三個指標,index2,index3和index5,給每個元素乘以2,3,5

offer 試題57刪除連結串列中的重複節點 c++

本題有兩種 第一題:在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->3->4->5  

offer 試題8二叉樹的下一個節點 c++

題目:給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。 解析:三種情況:1.若節點有右子樹,中序下一個就是 右子樹最左孩子節點  2.若無右子樹,且當前節點是父節點的左子節點,下一個就是父節點 &nb

offer 試題42左旋轉字串vs翻轉單詞順序 c++

題目:組合語言中有一種移位指令叫做迴圈左移(ROL),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於一個給定的字元序列S,請你把其迴圈左移K位後的序列輸出。例如,字元序列S=”abcXYZdef”,要求輸出迴圈左移3位後的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它!

offer 試題41和為s的兩個數字vs和為s的連續正數序列 c++

題目:輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 思路:兩個 指標,start從前往後遍歷,end從後往前遍歷,如果當前前後之和大於s,end--,如果當前前後之和小於s,start++,這樣能找出乘積最小的和

offer 試題41資料流中的中位數 c++

題目:如何得到一個數據流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。 思路:資料流的中位數最好使用兩個堆,這樣可以動態維護插入和獲得中位數的過程。可以使用一個大頂堆和一個小

offer{試題31連續子陣列的最大和}

思路: public class test31 { public int findMaxSum(int[] arr) { if(arr.length==0) return 0; int cur = arr[0];