zoukankan      html  css  js  c++  java
  • Library Functions Implementation

    void* memcpy(const void* src, void* des, unsigned int cnt) {
    	if (!src || !des)
    		return nullptr;
    	if (des > src && (const char*)src + cnt < (char*)des) {
    		const char* srcB = (const char*)src + cnt - 1;
    		char* desB = (char*)des + cnt - 1;
    		while (cnt--) {
    			*desB = *srcB;
    			--desB;
    			--srcB;
    		}
    	}
    	else {
    		const char* srcF = (const char*)src + cnt - 1;
    		char* desF = (char*)des + cnt - 1;
    		while (cnt--) {
    			*desF = *srcF;
    			++desF;
    			++srcF;
    		}
    	}
    	return des;
    }
    
    // 将original中的子串substr替换为replace
    char* strReplace(const char* original, const char* substr, const char* replace) {
    	if (!original || !substr || !replace) {
    		return NULL;
    	}
    
    	int len = strlen(original);
    
    	char* newStr = malloc((len + 1) * sizeof(char));
    	memcpy(newStr, original, (len + 1) * sizeof(char));
    
    	char* p = strstr(newStr, substr);
    	memcpy(p, replace, strlen(replace));
    
    	return newStr;
    }
    

    vector

    比较高频的问题:为什么push_back()的时间复杂度是(O(1))
    假设倍增因子是(m),vector当前有(n)个元素,那么扩容过程大致为:(0,1,m,m^2,...,m^{(log_nm)}),每次扩容的复杂度等于当前的元素个数,所以总的复杂度为:

    [1+m+m^2+...+m^{(log_mn)}=frac{mn-1}{m-1} ]

    如果(m=2),那么均摊到(n)个元素,每个元素的操作复杂度就是(O(1))

    template<typename T>
    class myvector {
    public:
    	void push_back(T& x) {
    		if (size == capacity) {
    			broad(2 * capacity + 1);
    		}
    		obj[size++] = x;
    	}
    private:
    	void broad(int newCap) {
    		if (newCap < size)
    			return;
    
    		T* tmp = obj;
    		obj = new T[newCap];
    		for (int i = 0; i < size; ++i) {
    			obj[i] = tmp[i];
    		}
    		delete[] tmp;
    	}
    	int size;
    	int capacity;
    	T* obj;
    };
    
    int myAtoi(const char* str) {
    	if (!str) {
    		throw "Invalid input!";
    	}
    
    	while (*str == ' ') {
    		++str;
    	}
    
    	int sign = 1;
    	if (*str == '+' || *str == '-') {
    		if (*str == '-') {
    			sign = -1;
    		}
    		++str;
    	}
    	else if (*str < '0' || *str > '9') {
    		throw "Invalid input!";
    	}
    
    	int value = 0;
    	while (*str != '' && *str >= '0' && *str <= '9') {
    		value = value * 10 + *str - '0';
    		++str;
    	}
    	return sign * value;
    }
    
    // O(mn),可以用KMP优化为O(m+n)
    class Solution {
    public:
        int strStr(string haystack, string needle) {
            if (needle.empty()) {
                return 0;
            }
            
            int i = 0, j = 0;
            while (i < haystack.size() && j < needle.size()) {
                if (haystack[i] == needle[j]) {
                    ++i;
                    ++j;
                } else {
                    i = i - j + 1;
                    j = 0;
                }
                
                if (j == needle.size()) {
                    return i - needle.size();
                }
            }
            return -1;
        }
    };
    
  • 相关阅读:
    c/c++字节序转换(转)
    O_DIRECT与O_SYNC区别(转)
    TCMalloc小记(转)
    内存优化总结:ptmalloc、tcmalloc和jemalloc(转)
    不依赖三方库从图像数据中获取宽高-gif、bmp、png、jepg
    Linux查看物理CPU个数、核数、逻辑CPU个数
    unix环境高级编程-3.10-文件共享(转)
    TF_Server gRPC failed, call return code:8:Received message larger than max (45129801 vs. 4194304)
    google doc上的云转换
    telnet 退出命令
  • 原文地址:https://www.cnblogs.com/EIMadrigal/p/13278336.html
Copyright © 2011-2022 走看看