面试经典代码实现题(更新中)

简单题(操作字符串,数组等)

1、输出数组的全排列(递归)

递归思想:将数组中所有的数与第一个数交换,在将后面n-1个数进行全排列
递归这个过程 --> 直到最后剩下自己和自己递归的时候输出序列

#include <bits/stdc++.h> 
using namespace std;

void perm(int list[], int k, int n) {
    if (k == n) {
    	for(int i = 0 ; i < n ; i ++) cout << list[i] <<' '; cout << endl ; 
        return;
    }
    for (int i = k; i < n; i++) { 
		// 将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。
        swap(list[k], list[i]);
        perm(list, k + 1, n);
        swap(list[k], list[i]);
    }
}

int main() {
    int List[5] = { 1, 2, 3, 4, 5 };
    perm(List, 0, 5);
    return 0;
}

数据结构

1、链表的反转

链表定义:

struct Node{
	int val;
	Node *next;
	Node(int x = 0) {
		val = x ;
		next = nullptr;
	}
};

链表的输出:

void printList(Node *head) {
	cout << "start to print : " << endl ;
	Node *curr = head;
	while (curr != NULL) {
		cout << curr->val << endl ;
		curr = curr->next ;
	}
}

链表的反转:
初始状态:
进入函数,定义指针的初始位置 , 置head->next = NULL;
进入函数,定义指针的初始位置

进入循环第一步赋值:(仅涉及指针的移动)
进入循环第一步赋值
--------------if(next == NULL) [判断是否终止]-----------

进入循环第二步赋值:(涉及next指针的赋值)
循环结束后各指针状态

Node* reverseList(Node *head) {
	Node *curr , *prev , *next ;
	curr = head ;
	prev = head ;
	next = curr->next ;
	head->next = NULL ;
	
	while(next != NULL) {
		curr = next ;
		next = next->next ;
		
		if(next == NULL) {
			curr->next = prev ;
			head = curr ;
			break ;
		}
		curr->next = prev ;
		prev = curr ;
	}
	return head;
}
2、最小栈的实现

时间O(1),空间O(1)的最佳解法:

#include <bits/stdc++.h>
using namespace std;

stack<int> s ;
int minVal = 0;

void push(int x) {
	if(s.empty()) {
		minVal = x;
		s.push(0);
	} else {
		s.push(x - minVal);
		minVal = min(minVal, x);
	}
}
// 比如 当时的 minvalue = 2  push(1)  -> minvalue = 1  s.push(-1);
// 在pop(-1)时 要还原原先的minvalue(也就是2) 需要 minvalue - s.top() (=2);
// 而pop(num > 0)的的时候不需要赋值 因为在s.push的时候 最小值没有发生变化 直接s.pop()
void pop() {
	int top = s.top();
	if(top < 0) minVal = minVal - top;
	s.pop();
}
int getMin() {
	return minVal;
}
int main() {
	int list[5] = {4,3,2,5,1};
	minVal = 0 ;
	cout << "MinVal of pushing in stack : " << endl ;
	for(int i = 0 ; i < 5 ; i ++) {
		push(list[i]);
		cout << getMin() << endl ;
	}
	cout << "MinVal of poping out of stack : " << endl ;
	while(!s.empty()) {
		cout << getMin() << endl ;
		pop();
	}
	return 0;
}

其他解法可以参考这个朋友的思路:
记一次面试:最小栈的最佳解法

算法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值