[ 剑指Offer ] Week2 学习笔记

打印从1到最大的n位数

题解:由于未知n的大小,需要考虑大数问题。在这样的情况下,逐位地将字符串转换为数字输出,不会有溢出的可能。使用全排列的方式列出所有数字,省去了需要考虑进位的可能。

  1. 初始化数组,存放“数字“,定义为char类型。
  2. 从0位开始遍历数字0-9,直至第n-1位。
  3. 当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;
    }
};




上一篇:20190202 week2


下一篇:2021-2022学年英语周报九年级第1期答案及试题