【杂】笔试题

复杂链表的复制

描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
代码:

/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
class Solution {
public:
    RandomListNode* Clone_main(RandomListNode* pHead, int dep) {
        if (pHead == NULL) return NULL;
        RandomListNode *new_ptr = new RandomListNode(pHead->label);
        new_ptr->next = Clone_main(pHead->next, dep+1);
        old_ptr_to_id[pHead] = dep;
        new_id_to_ptr[dep] = new_ptr;
        return new_ptr;
    }

    void Clone_random(RandomListNode* pHead, RandomListNode* newHead) {
        if (pHead == NULL) return;
        int id = old_ptr_to_id[pHead->random];
        newHead->random = new_id_to_ptr[id];
        Clone_random(pHead->next, newHead->next);
    }

    map<RandomListNode*, int> old_ptr_to_id;
    map<int, RandomListNode*> new_id_to_ptr;

    RandomListNode* Clone(RandomListNode* pHead)
    {
        RandomListNode *new_ptr = Clone_main(pHead, 0);
        old_ptr_to_id[NULL] = -1;
        new_id_to_ptr[-1] = NULL;
        Clone_random(pHead, new_ptr);
        return new_ptr;
    }
};
*/

Ugly Number

参考Poj 1338
用优先队列乱搞一下也行,不过在poj discuss里面发现了很溜的方法
我们可以设idx2,idx3,idx5是三个位于已经求出的Ugly Number中的指针,每次取最小的生成下一个Ugly Number后向后移动。唯一要注意的是会有重复的生成,需要判断一下。

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if (index == 1) return 1;

        vector<int> seq(index+1);
        seq[0] = 1;
        int idx2 = 0, idx3 = 0, idx5 = 0;
        for (int i=1;i<=index-1;++i) {
            seq[i] = min (seq[idx2] * 2, min (seq[idx3]*3, seq[idx5]*5));
            if (seq[i] == seq[idx2] * 2) ++idx2;
            if (seq[i] == seq[idx3] * 3) ++idx3;
            if (seq[i] == seq[idx5] * 5) ++idx5;
        }
        return seq[index-1];
    }
};

位运算模拟加法

最简单的方法,从低位到高位模拟,记录下进位
还有更流弊的方法,直接用异或和与两种操作。。。

int Plus (int lhs, int rhs) {
    int cf = 0, ret = 0;
    for (int i=0;i<32;++i) {
        int a = (lhs>>i)&1, b = (rhs>>i)&1;
        int new_cf = (a&b) | (a&cf) | (b&cf), bit = a^b^cf;
        ret |= (bit << i);
        cf = new_cf;
    }
    return ret;
}

求1+2+3+…+n

求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句
递归的思路很好想。。
这里还有几种开脑冻的做法。。。

class Solution {
public:

    int dfs(int &sum, int n) {
        sum += n;
        return !n || dfs(sum, n-1);
    }

    int Sum_Solution(int n) {
        int ret = 0;
        dfs(ret, n);
        return ret;
    }
};
代码下载地址: https://pan.quark.cn/s/b4a8e0160cfc 齿轮与轴系零件在机械设备中扮演着至关重要的角色,它们负责实现动力传输、调整运动形态以及承受工作载荷等核心功能。 在机械工程的设计实践中,齿轮和轴系的设计是一项关键的技术任务,其内容涵盖了材料选用、构造规划、承载能力分析等多个技术层面。 下面将系统性地介绍《齿轮及轴系零件结构设计指导书》中的核心知识点。 一、齿轮设计1. 齿轮种类:依据齿廓轮廓的不同,齿轮可划分为直齿齿轮、斜齿轮以及人字齿轮等类别,各类齿轮均具有特定的性能特点与适用工况,能够满足多样化的工作环境与载荷需求。 2. 齿轮规格参数:模数大小、压力角数值、齿数数量、分度圆尺寸等是齿轮设计的基础数据,这些参数直接决定了齿轮的物理尺寸与运行性能。 3. 齿轮材质选用:齿轮材料的确定需综合评估其耐磨损性能、硬度水平以及韧性表现,常用的材料包括铸铁、钢材、铝合金等。 4. 齿轮强度验证:需进行齿面接触应力分析与齿根弯曲应力分析,以确保齿轮在实际运行过程中不会出现过度磨损或结构破坏。 5. 齿轮加工工艺:涉及切削加工、滚齿加工、剃齿加工、淬火处理等工艺流程,工艺方案的选择将直接影响齿轮的加工精度与使用寿命。 二、轴设计1. 轴的分类方式:依据轴在机械装置中的功能定位与受力特点,可将轴划分为心轴、转轴以及传动轴等类型。 2. 轴的材料选择:通常采用钢材作为轴的材料,例如碳素结构钢或合金结构钢,特殊需求时可选用不锈钢材料或轻质合金材料。 3. 轴的构造规划:需详细考虑轴的轴向长度、截面直径、键槽布置、轴承安装位置等要素,以满足轴的强度要求、刚度要求以及稳定性要求。 4. 轴的强度验证:需进行轴的扭转强度分析与弯曲强度分析,以防止轴在运行过程中发生塑性变形...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值