2018-11-06 面试手撕代码题

字符串变成整型数字

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

int StrToInt(string str) {
    
    if (!str.size()) return 0;
    int s = 1;
    long long res = 0;
    if (str[0] == '-') 
        s = -1;
    
    for (int i = (str[0] == '-' || str[0] == '+') ? 1 : 0; i < str.size(); ++i) {
        if (!('0' <= str[i] && str[i] <= '9')) return 0;
        res = res * 10 + str[i] - '0';
    }
    return res * s;
}
int main() {
    string str;
    getline(cin, str);
    cout << StrToInt(str) << endl;
    return 0;
}

取出字符串中连续重复的字符,只保留一个

#include<iostream>
#include<string>
using namespace std;
//输入一串字符串,将其中连续重复的字符保留其中一个,如aabbccbc,保留abcbc

string func(string arr) {
    char* p1 = &arr[0];
    char* p2 = &arr[1];
    while (*p2 != '\0') {
        if (*p2 == *p1) {
            *p2 = '\0';
            p2++;
        }
        else {
            p1++;
            *p1 = *p2;
            *p2 = '\0';
            p2++;
        }
    }
    return arr;
}
int main() {
    string str;
    cin >> str;
    cout << func(str);

    system("pause");
    return 0;
}

取出字符串中间的重复空格

#include <iostream>
using namespace std;
//输入"___a____b__c___"字符串,"_"代表空格
//将字符串前后的空格去掉,中间的空格保留一个,输出为"a_b_c"
char *deleteTheBlank(char str[]) {
    if (str == NULL)
        return NULL;
    char *p1 = &str[0];
    char *p2 = &str[0];
    while (*p2 == ' ') {
        p2++;
        if (p2 == NULL)
            return NULL;
    }
    *p1 = *(p2++);
    while (*p2 != '\0') {
        if (*p2 != *p1) {
            p1++;
            *p1 = *p2;
        }
        p2++;
    }
    if (*p1 == ' ') {
        *p1 = '\0';
    }
    return str;
}

int main() {
    char arr[] = "   a  b  c   ";
    printf("%s", arr);
    cout << "end" << endl;
    char *arr_res = deleteTheBlank(arr);
    printf("%s", arr_res);
    system("pause");
    return 0;
}

常见排序算法

三种简单排序:冒泡排序,插入排序,选择排序

这三种排序都是稳定的,时间复杂度是O(n^2),空间复杂度是O(1)。

#include <iostream>
using namespace std;
//改进版冒泡排序
void bubble_sort(int a[], int len) {
    int tmp{};
    bool flag{};
    for (int i = 0; i < len; i++) {
        flag = 0;
        for (int j = len - 1; j >= i; j--) {
            if (a[j] < a[j - 1]) {
                flag = 1;
                tmp = a[j];
                a[j] = a[j - 1];
                a[j - 1] = tmp;
            }
        }
        if (!flag) return;
    }
}
//直接插入排序
void insert_sort(int a[], int n) {
    int i, j, tmp;
    for (i = 1; i < n; i++) {
        tmp = a[i];
        for (j = i - 1; j >= 0 && a[j] > tmp; j--) {
            a[j + 1] = a[j];
        }
        a[j + 1] = tmp;
    }
}
//选择排序
void select_sort(int a[], int len) {
    for (int i = 0; i < len; i++) {
        int k = i;
        int tmp = a[i];
        for (int j = i + 1; j < len; j++) {
            if (a[j] < tmp) {
                tmp = a[j];
                k = j;
            }
        }
        a[k] = a[i];
        a[i] = tmp;
    }
}

int main() {
    int arr[10] = { 54,38,96,15,23,72,60,45,83,64 };
    
    //冒泡排序
    //bubble_sort(arr, 10);
    //直接插入排序
    //insert_sort(arr, 10);
    //选择排序
    select_sort(arr, 10);

    for (int i = 0; i < 10; i++) {
        cout << arr[i] << ' ';
    }

    system("pause");
    return 0;
}

改进排序:快速排序,堆排序,归并排序,希尔排序,基数排序

快速排序

时间复杂度O(nlogn),空间复杂度O(1),不稳定

#include <iostream>
using namespace std;
//快速排序
void quick_sort(int a[], int left, int right) {
    if (left >= right) return;
    int i = left;
    int j = right;
    int tmp = a[left];
    while (i < j) {
        while (a[j] >= tmp && i<j) {
            j--;
        }
        while (a[i] <= tmp && i < j) {
            i++;
        }
        if (i < j) {
            int t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }
    a[left] = a[i];
    a[i] = tmp;
    quick_sort(a, left, i - 1);
    quick_sort(a, i + 1, right);
    return;
}

int main() {
    int arr[10] = { 54,38,96,15,23,72,60,45,83,64 };
    //快速排序
    quick_sort(arr, 0, 9);

    for (int i = 0; i < 10; i++) {
        cout << arr[i] << ' ';
    }

    system("pause");
    return 0;
}
堆排序

时间复杂度O(nlogn),空间复杂度O(1),不稳定

#include <iostream>
using namespace std;

void swap(int &a, int &b) {
    int tmp = a;
    a = b;
    b = tmp;
}
//最大堆调整
void maxHeapBuild(int arr[], int index, int end) {
    int left = index * 2 + 1;
    int right = left + 1;
    int largest = index;
    if ((left <= end) && (arr[largest] < arr[left])) {
        largest = left;
    }
    if ((right <= end) && (arr[largest] < arr[right])) {
        largest = right;
    }
    if (largest != index) {
        swap(arr[index], arr[largest]);
        maxHeapBuild(arr, largest, end);
    }
}
void heap_sort(int arr[], int len) {
    //将数组初始堆进行调整变为最大堆
    for (int i = len / 2 - 1; i >= 0; i--) {
        maxHeapBuild(arr, i, len - 1);
    }
    //依次交换第一个和最后一个未排序的数
    for (int i = len - 1; i >= 0; i--) {
        swap(arr[0], arr[i]);
        maxHeapBuild(arr, 0, i - 1);
    }
}

int main() {
    int arr[10] = { 54,38,96,15,23,72,60,45,83,64 };
    
    //最大堆排序
    heap_sort(arr, 10);

    for (int i = 0; i < 10; i++) {
        cout << arr[i] << ' ';
    }

    system("pause");
    return 0;
}
归并排序

时间复杂度O(nlogn),空间复杂度O(n),稳定

#include <iostream>
using namespace std;

void merge(int arr[], int tmp[], int left, int right, int r_end) {
    int l_end = right - 1;  //左区间终点
    int tmp_index = left;   //临时数组索引
    int num = r_end - left + 1;    //两部分区间总的元素个数
    //依次比较两部分元素大小,较小的先放进tmp数组
    while (left <= l_end && right <= r_end) {
        if (arr[left] < arr[right]) {
            tmp[tmp_index++] = arr[left++];
        }
        else {
            tmp[tmp_index++] = arr[right++];
        }       
    }
    //左区间或者右区间可能还含有剩余元素
    while (left <= l_end) {
        tmp[tmp_index++] = arr[left++];
    }
    while (right <= r_end) {
        tmp[tmp_index++] = arr[right++];
    }
    for (int i = 0; i < num; i++, r_end--) {
        arr[r_end] = tmp[r_end];
    }
}

void m_sort(int arr[], int tmp[], int low, int high) {
    if (low >= high) return;
    int mid = (low + high) / 2;  //拆分点
    m_sort(arr, tmp, low, mid);  //对前半部分递归做归并排序
    m_sort(arr, tmp, mid + 1, high);
    merge(arr, tmp, low, mid + 1, high);  //将两部分有序区间合并
}

//自顶向下归并排序
void merge_sort(int arr[], int len) {
    int *tmp = NULL; //指针初始化指向NULL
    tmp = new int[len]; //分配临时数组
    if (tmp != NULL) {
        m_sort(arr, tmp, 0, len-1);
        delete []tmp;
    }
}

int main() {
    int arr[10] = { 54,38,96,15,23,72,60,45,83,64 };
    
    merge_sort(arr, 10);
    for (int i = 0; i < 10; i++) {
        cout << arr[i] << ' ';
    }

    system("pause");
    return 0;
}
希尔排序

时间复杂度O(nlogn)-O(n^2),空间复杂度O(1),不稳定。

#include <iostream>
using namespace std;
//希尔排序
void shell_sort(int a[], int n) {
    int h, i, j, tmp;
    for (h = n / 2; h > 0; h = h / 2) {
        for (i = h; i < n; i++) {
            tmp = a[i];
            for (j = i - h; j >= 0 && a[j] > tmp; j-=h) {
                a[j + h] = a[j];
            }
            a[j + h] = tmp;
        }
    }
}

int main() {
    int arr[10] = { 54,38,96,15,23,72,60,45,83,64 };
    
    shell_sort(arr, 10);
    for (int i = 0; i < 10; i++) {
        cout << arr[i] << ' ';
    }

    system("pause");
    return 0;
}

字符串的复制和赋值

字符串复制

数组复制

void strcpy(char *des,char *src)
{
    int i;
    for(i=0;src[i]!='\0';i++)
    {
        des[i] = src[i];
    }
    des[i] = '\0';
}

指针复制

void strcpy(char *des,char *src)
{
    while(*des++ = *src++) ;
}

字符串赋值

  1. 定义时初始化赋值
char buf[20]="hello world!";
char *str="hello world!"
  1. 先定义再初始化
char buf[20];   char*str;
buf = "I love china";   //错误,数组名是常量,不能被赋值    
strcpy (buf, "I love china");    
str = "I love china";          
strcpy(str, "I love china");  //段错误,没有给str指针分配内存
  1. 上述最后一种方法的改正
str = (char *)malloc(sizeof(char)*20);
strcpy(str, "I love china");

链表翻转

struct node {
    int val;
    node *next;
};
//链表翻转
node *list_reverse(node *head) {
    if (head->next = NULL) return;
    node *p = head, *q = head, *r = head;
    p = head->next;
    q = p->next;
    p->next = NULL;
    while (q != NULL) {
        r = q->next;
        q->next = p;
        p = q;
        q = r;
    }
    head->next = p;
    return head;
}

字符串反转

#include <iostream>
using namespace std;

void swap(char &a, char &b) {
    char tmp = a;
    a = b;
    b = tmp;
}
//字符串反转
void reverse(char arr[]) {
    int len = strlen(arr);
    for (int i = 0; i < len/2; i++) {
        swap(arr[i], arr[len - 1 - i]);
    }
}
int main() {
    char arr1[] = "goodboy";
    reverse(arr1);
    printf("%s\n", arr1);
    system("pause");
    return 0;
}

字符串反转可以用来进行循环移位
例如要对goodboy循环右移四位得到boygood,则可以先将字符串分割成前面四位good(即将被循环移位),和后面三位boy。这两部分先自己进行反转,得到doogyob。然后对这个字符串进行整体反转,就可以得到boygood了。怎么样,是不是很奇妙

数组反转

#include <iostream>
using namespace std;
void swap(int &a, int &b) {
    int tmp = a;
    a = b;
    b = tmp;
}
//数组反转
void reverse(int arr[], int len) {
    for (int i = 0; i < len / 2; i++) {
        swap(arr[i], arr[len - 1 - i]);
    }
}
void print_arr(int arr[],int len) {
    for (int i = 0; i < len; i++) {
        cout << arr[i] << ' ';
    }
    cout << endl;
}
int main() {
    int arr2[] = { 0,1,2,3,4,5 };
    int len = sizeof(arr2) / sizeof(arr2[0]);
    reverse(arr2, len);
    print_arr(arr2, len);
    system("pause");
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 一、 C/C++程序基础 面试例题1——分析代码写输出(一般赋值语句的概念和方法)。 面试例题2—...
    LuckTime阅读 1,970评论 2 42
  • 算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...
    第六象限阅读 3,065评论 0 0
  • 财富自由的最终目标是时间自由,不为自己的生活必须开支而出售自己的时间,而是把自己的时间,用在真正想做的事情上。 但...
    伪思考宰飞阅读 260评论 0 0
  • 5.1 创建数据访问对象类 数据访问对象即Data Access Object(缩写为 DAO )。它向需要访问数...
    jingz课程阅读 677评论 2 1
  • 最近身体出现状况,频繁拉警报,所以和小伙伴约好每天早上一起走路。 走在路上,想着一行禅师在《一心走路中》说的,每走...
    OH刘玲阅读 257评论 0 1