1 strcpy,

char * strcpy(char* target, char* source)
{  // 不返回const char*, 因为如果用strlen(strcpy(xx,xxx)),类型不匹配。
assert(source != NULL && target != NULL);

char* p = target;

while ((*target++ = *source++) != '\0')  // 先赋值,然后用表达式和‘\0’比较,最后指针加1
;
return p;     // 这个算法有可能出现地址被覆盖的情况
}

source 拷贝的时候,就把自己的后部分给覆盖了,当source < target && soure + strlen -1 >target时候会出现这种情况。
防止覆盖的解决方案是倒拷贝。(分两种情况处理: 正常情况,和倒着拷贝。)

strcat

char *Strcat(char *pszDest, const char* pszSrc)
{char* p = pszDest;
   while(*pszDest) pszDest++; 
while((*pszDest++ = *pszSrc++));
return p;
} 2 String 的默认函数

Mystring::Mystring(const char *str)
{
if (NULL == str)
{
m_data = new char[1];
m_data[0] = '\0';
}
else
{
m_data = new char[strlen(str) + 1];
strcpy_s(m_data,strlen(str)+1, str);
}
}

Mystring::~Mystring()
{
delete[] m_data;
}

Mystring::Mystring(const Mystring &another)
{
m_data = new char[strlen(another.m_data) + 1];
strcpy_s(m_data,strlen(another.m_data)+1 ,another.m_data);
}

const Mystring& Mystring::operator=(const Mystring &rhs)
{
if (this == &rhs)
return *this;

delete []m_data;

m_data = new char[strlen(rhs.m_data) + 1];  
strcpy_s(m_data,strlen(rhs.m_data) + 1,rhs.m_data);

return *this;
}

3 链表逆置

typedef struct Node

{

int data;

Node *next;

}LinkedNode, *LinkedList;

void reversse(LinkedList  &head)

{

if(head == NULL ||  head->Next == NULL)

return;

LinkedList p = head->next;

LinkedList q = NULL;

head->next = NULL;

while(p)

{ q = q->next;

p->next = head;

head = p;

p = q;

}

head = p;

}

4 有序链表合并,用递归和非递归

递归:每次从当前节点选一个进入合并的链表,对余下的再合并。

LinkedList ListMerge(LinkedNode* p1, LinkedNode *p2)

{

  if (p1 == NULL)
    return p2;
  if (p2 == NULL)
    return p1;

LinkedList head = NULL;

  if (p1->next < p2->next)
    { head = p1;

head->next   = ListMerge(p1->next,  p2);

}

  else
    {head = p2;

head->next  = ListMerge(p1,  p2->next)

}

return  head;

}

非递归:

LinkedList ListMerge2(LinkedNode *p1, LinkedNode *p2)

{

LinkedList head = NULL;

LinkedList p = NULL;
if (p1->data < p2->data)
{
head = p1;
p1 = p1->next;
}
else
{
head = p2;
p2 = p2->next;
}

p = head;

while (p1 != NULL && p2 != NULL)
{
if (p1->data < p2->data)
{
p->next = p1; p1 = p1->next;
}
else
{
p->next = p2; p2 = p2->next;
}

p = p->next;
}

if (p1 != NULL)
p->next = p1;
else
p->next = p2;

return head;

}

5 写一个函数找出一个整数数组中,第二大的数

template<class T>

T  secondMax(vector<T>  v)

{

int max = 0;     //最大值下标

int second = 0; // 第二大值下标

  for (int i = 0; i < v.size; i++)
  {
    if (v[i] > v[max])
    {  max = i;
      second = max;
    }
    else if (v[i] < v[max] && v[i] > v[second])
      second = i;
}

reutrn second;

}

6 判断单链表是否有环? 如果有,环的长度?第一个环上的点在哪?

          判断有环:两个 指针,一个步长是1,另一个步长是2,如果有环的话,二者遍历会相交。

环的长度:相交的点一定在环上,那么从这个交点开始遍历,记录遍历长度,再回来时就得到长度。

第一个环上的点:还是找到相交的那个点,参考下一个问题的答案。

7 判断两个链表是否有交点? 第一个交点在哪?

        判断是否相交:把其中一个链表的头尾连接,判断是否有环。

第一个交点:   得到两个链表的长度,求得长度差K,然后长的那个先走K步,然后一起走,第一个交点就是。

 8 二分查找

int BinarySearch(int *array, int aSize, int key)  // 从长度为aSize的数组array找到等于key的记录,array有序
{
  if (array == NULL || aSize <= 0)
    return -1;

  int low = 0;
  int high = aSize - 1;
  int mid = 0;

  while (low <= high)
  {
    mid = (low + high) / 2;
    if (key > array[mid])
      low = mid + 1;
    else
      if (key < array[mid])
        high = mid - 1;

    else
      return mid;

  }
  return -1;
}

9 冒泡排序

void bubbleSort(int *array, int len)
{
  for (int i = 0; i < len ; i++ )
    for (int j = 0; j < len - i-1; j++)
    {
          if (array[j] > array[j + 1])
                    swap(array[j], array[j + 1]);
    }
}

10 直接插入排序

void insert(int *array, int len)

{

  for (int i = 1; i < len; i++)

{

int temp = array[i];

for(int j = i-1; j > 0; j--)

{

if(temp < array[]j);

array[j+1] = array[j];

}

}

}

11 希尔排序

  不稳定的排序,平均时间复杂度是nlogn, 保证最后的步长是1.  直接插入排序,每次移动一个位置,希尔排序大步伐的移动。

12 直接选择排序

  void select(int *arrya, int len)

{

for (int i = 0; i < len; i++)

{

int min = array[i];

int index = i;

for(int j = i + 1; j < len; j++)

{     if (array[j] < min)

{

             min = array[j];

index = j;

}

}

if (i != index)

swap(array[i], array[index]);

}

}

13 快速排序

int  quickSort(int *array, int low, int high)

{

if(low == high) return;

int begi = low;

int end = high;

int piv = array[low]

while(low < high)

{   while(high > low &&  array[high] >piv)

high--;

if (low < high) array[low] = arrray[high];

while(hgih > low && array[low] < piv)

low++;

if(low < high) array[high] = array[low];

}

array[low] = piv;

quickSort(array, begin, low -1);

quickSort(array, high-1, end);

}

14   输入一个数组,实现一个函数,让所有奇数都在偶数前面:

               答案:一次快排解决问题.

 15 归并排序

void merge_sort(int *data, int start, int end, int *result)
{ if(end == start) return
if (end - start == 1) //区间只有2个元素
{
if(data[start] > data[end])
{
int temp = data[start];
data[start] = data[end];
data[end] = temp;
}
}
else // 继续进行划分
{ merge_sort(data, start, (end-star+1)/2 + start, result);
merge_sort(data, (end-start+1)/2 + start +1, end, result);
merge(data, start, end, result); // 把两个有序的列 归并到 result中。

for(int i = start; i <= end; i++)
data[i] = result[i];
}
}

void merge(int *data,int start,int end,int *result) // start到end这一段中,前半部分有序,后半部分有序,
// 归并到result中。
{
int left_length = (end-sart + 1)/2 +1;
int lef_index = start;
int right_index = start +left_length;
int result_index = start;
while(left_index < start + left_length && right_index < end +1)
{
if(data[left_index] <= data[right_index])
resutl[result_index++] = data[left_index++];
else
result[result_index++] = data[right_index++];
}

while(left_index < start +left_lenght)
result[result_index++] = data[left_index++];
while(right_indx < end + 1)
result[result_index++]=data[right_index++];
}

merge_sort(data,0,length-1,result);  // result是格外的存储空间

15 堆排序

16 前序,中序, 后序遍历二叉树的非递归

17 KMP算法

C++常考算法的更多相关文章

  1. BFS与DFS常考算法整理

    BFS与DFS常考算法整理 Preface BFS(Breath-First Search,广度优先搜索)与DFS(Depth-First Search,深度优先搜索)是两种针对树与图数据结构的遍历或 ...

  2. Leetcode——二叉树常考算法整理

    二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 二叉树常考算法 ...

  3. c++常考算法知识点汇总

    前言:写这篇博客完全是给自己当做笔记用的,考虑到自己的c++基础不是很踏实,只在大一学了一学期,c++的面向对象等更深的知识也一直没去学.就是想当遇到一些比较小的知识,切不值得用一整篇 博客去记述的时 ...

  4. .NET面试常考算法

    1.求质数    质数也成为素数,质数就是这个数除了1和他本身两个因数以外,没有其他因数的数,叫做质数,和他相反的是合数,    就是除了1和他本身两个因数以外,还友其他因数的数叫做合数. 1 nam ...

  5. JS-常考算法题解析

    常考算法题解析 这一章节依托于上一章节的内容,毕竟了解了数据结构我们才能写出更好的算法. 对于大部分公司的面试来说,排序的内容已经足以应付了,由此为了更好的符合大众需求,排序的内容是最多的.当然如果你 ...

  6. 面试常考的常用数据结构与算法(zz)

    数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易.在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考察一个人这方面的能力,把每种结 ...

  7. C++常考面试题汇总

    c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...

  8. Java面试题中常考的容易混淆的知识点区别

    以下是我收集的Java编程里各种区别,供Java学习爱好者参考,这些区别都是每次Java面试中常考的,大家好好掌握,如有失误请留言指出.想要获取Java详细全套学习资料请到上海尚学堂官网获取. 1.H ...

  9. 近5年常考Java面试题及答案整理(三)

    上一篇:近5年常考Java面试题及答案整理(二) 68.Java中如何实现序列化,有什么意义? 答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写 ...

随机推荐

  1. 剑指offer--45.二叉树的深度

    时间限制:1秒 空间限制:32768K 热度指数:139716 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. -- ...

  2. GPU编程自学3 —— CUDA程序初探

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

  3. List connected users–similar to task manager

    class Program { [DllImport("wtsapi32.dll")] static extern IntPtr WTSOpenServer([MarshalAs( ...

  4. Android编程 高德地图 AMapLocationClientOption 类中 setWifiActiveScan过时

    高德地图中   定位包中有以下方法: AMapLocationClientOption  类中  setWifiActiveScan  过时 isWifiActiveScan public boole ...

  5. MySQL开放外部链接

    问题 指令空格 执行命令netstat -nat | grep :3306的时候,注意grep后一定要有空格!!! 该指令的功能为:让服务器接受远程连接.不过这样只能用于本地连接. 真正外部链接详见 ...

  6. 白话machine learning之Loss Function

    转载自:http://eletva.com/tower/?p=186 有关Loss Function(LF),只想说,终于写了 一.Loss Function 什么是Loss Function?wik ...

  7. Luogu3387 缩点 【tarjan】【DP】

    Luogu3387 缩点 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点, ...

  8. BZOJ3196 Tyvj1730 二逼平衡树 【树套树】 【线段树套treap】

    BZOJ3196 Tyvj1730 二逼平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名 ...

  9. 剑指offer第三章

    剑指offer第三章 1.数值的整数次方 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. class Solution { public ...

  10. 《selenium2 python 自动化测试实战》(3)——操作测试对象

    上一节我们说了如何定位元素,定位到元素以后就涉及到对元素的操作了,webdriver中常用的操作元素的方法有: clear  ——用于清除输入框的默认内容 send_keys  ——用于在一个输入框里 ...