简单题(操作字符串,数组等)
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;
}
其他解法可以参考这个朋友的思路:
记一次面试:最小栈的最佳解法