打印从1到最大的n位数
题解:由于未知n的大小,需要考虑大数问题。在这样的情况下,逐位地将字符串转换为数字输出,不会有溢出的可能。使用全排列的方式列出所有数字,省去了需要考虑进位的可能。
- 初始化数组,存放“数字“,定义为char类型。
- 从0位开始遍历数字0-9,直至第n-1位。
- 当index来到n位时,输出数组内数字。
#include<iostream>
using namespace std;
int n;
void printNumber(char num[]) {
int i = 0;
while(num[i] == '0') i++;
for(int k = i; k < n; k++) {
cout << num[k] - '0';
}
cout << endl;
}
void increment (char num[], int x) {
if(x == n) printNumber(num);
else {
for(int i = 0; i < 10; i++) {
num[x] = i + '0';
increment(num, x+1);
}
}
}
int main() {
cin >> n; //n位数
if(n < 0 || n == 0) exit(-1);
char num[n];
memset(num, '0', sizeof num);
increment(num, 0); //从第0位开始
return 0;
}
面试提示:如果是关于n为的整数并且没有限定n的取值范围,或者输入任意大小的整数,那么题目很可能是需要考虑大数的问题。字符串是解决大数的有效方法之一。
删除链表的结点
题解:给出待删除结点,要求在\(O(1)\)时间内删除,好办法就是值替换。不过被考研数据结构残害的思想体系下,真的想不到这么新奇的办法。
( 闫总题目前提是:假设链表一定存在,并且该节点一定不是尾节点。) 所以没有进行多余判断。
class Solution {
public:
void deleteNode(ListNode* node) {
node->val = node->next->val;
node->next = node->next->next;
}
};