【面试题Part 5】:数据结构

####数据结构对于涉及计算机的任何岗位应该都是必不可少的,“入门”的方法也有很多,比如看书或者视频跟着敲代码,持之以恒。

1---栈和队列的区别

栈:后进先出,只能在一端进行出栈入栈操作,遍历从栈顶开始

队列:有队头队尾,队头出栈,队尾进栈,先进先出,两端遍历

 

栈的特点及实际应用

浏览器回退

括号匹配,后缀表达式

进制转换

 

队列应用:消息队列,进程调度

2----排序算法有哪些,复杂度是多少

简单插入排序

希尔排序

冒泡排序

快速排序

选择排序

归并排序

堆排序

基数排序

计数排序:不基于比较

桶排序:映射函数

 

3----快排和归并排序,复杂度

具体的思想可以自行百度一下,只要理解透了就不会忘记

 

4----链表和数组的区别

数组:顺序。连续内存空间,随机访问,查询修改方便,稳定

链表:链式,不连续,插入删除方便,指针连接,动态

 

5----二分查找的时间复杂度是多少

查找算法:顺序查找,二分查找,分块查找,哈希表查找

折半查找:O(log2n)

红黑树:平衡查找树

根节点黑色,

叶子节点黑色,

红节点的子节点黑色,

任意节点到叶子节点的路径包含相同数目的黑节点

叶节点到根不能有连续两个红节点

6------如何不用递归,实现二叉树的前序遍历

循环、栈

//前序非递归
    void _PreOrderNR(pNode _pRoot){
        pNode pCur = _pRoot;
        stack<pNode> s;
        while (pCur || !s.empty()){
            //将左侧节点依次压栈
            while (pCur){
                cout << pCur->_data << "  ";
                s.push(pCur);
                pCur = pCur->_pLeft;
            }
            //开始依次访问栈顶节点的右子树,通过循环将该右子树的左侧节点依次压栈
            pNode pTop = s.top();
            s.pop();
            pCur = pTop->_pRight;//循环的子问题
        }
    }

7-----从数组中找出三数之和为n

#两数和
# -*- coding:utf-8 -*-
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        res = []
        len1, minM = len(array), 10000000
        if len1 < 2: return res
        for i, value in enumerate(array):
            if (tsum - value) in array[i+1:]:
                if value*(tsum - value)<minM:
                    minM = value*(tsum - value)
                    res = [value, tsum - value]
        return res

def Sum3(arr, target):
    arr.sort()
    len1 = len(arr)
    res = []
    if len1<=2: print(res)
    for i in range(len1 - 1):
        left, right = i + 1, len1 - 1 # 以下思路与2sum中的快速排序思想一样
        while left < right:
            sum = arr[i] + arr[left] + arr[right]
            if sum == target and [arr[i], arr[left], arr[right]] not in res:
                res.append([arr[i], arr[left], arr[right]])
                left += 1
                right -= 1
            elif sum < target:
                left += 1
            else:
                right -= 1
    print(res)
 
if __name__ == '__main__':
    arr = [int(i) for i in input().split()]
    target = int(input())
    Sum3(arr, target)

8-----数组结构如何转换成树结构,说说思路

字符串数组

分割

正则

 

9------哈希算法

根据设定的哈希函数H(key)和处理冲突的方法将一组关键字影像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便成为哈希表,这一映像过程称为哈希造表或散列,所得存储位置称哈希地址或散列地址。

哈希函数是指:有一个对应关系 f ,使得每个关键字和结构中一个唯一的存储位置相对应,这样在查找时,我们不需要像传统的查找算法那样进行比较,而是根据这个对应关系 f 找到给定值K的像f(K)。

哈希函数也可叫哈希算法,它可以用于检验信息是否相同(文件校验),或者检验信息的拥有者是否真实(数字签名)

---------------------------------------------------------------------------------------------------

还有一些问题可以自己百度了解下:

  • 排序算法知道哪些?快排的思想,时间复杂度(最优,最差)?
  • 数据结构hashmap,不用map如何实现?
  • static作用,数组,栈,队列,指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值