算法编程解题思路:

  • 给出算法的基本设计思想
  • 根据设计思想,采用 Java 或者 python 语言描述算法,关键之处给出注释
  • 说明时间复杂度和空间复杂度

一、顺序表

1、长度为 n 的顺序表 L,编写一个时间复杂度为 O(n),空间复杂度为O(1) 的算法,该算法删除线性表中所有值为 x 的数据元素。

方法一:定义指针 index,遍历数组的元素,当元素的值不为 x 时,将当前元素前置到 index 位置上,同时 index 自增。

def function(nums, x):index = 0for i in range(0, len(nums)):if nums[i] != x:nums[index] = nums[i]index += 1print(nums[0: index])

方法二:定义变量 count,用于统计值为 x 的数量,遍历数组的元素,当元素的值不为 x,将下标为 i 的元素前置到 i - count 的位置。

def function(nums, x):count = 0for i in range(0, len(nums)):if nums[i] == x:count += 1else:nums[i - count] = nums[i]print(nums[0: len(nums) - count])

2、从顺序表中删除所有其值重复的元素,使表中所有元素的值均不相同

思路:定义指针 index,遍历数组的元素,当元素 nums[index] 不等于 nums[i] 时,说明 nums[index] 不需要被删除,所以,index 先自增,然后,将当前元素前置到 index 位置上。

举例说明:

def function(nums):index = 0for i in range(1, len(nums)):if nums[index] != nums[i]:index += 1nums[index] = nums[i]print(nums[0: index + 1])

3、线性表(a1, a2, a3, ……,an)中元素递增有序,且按顺序存储于计算机内。要求设计一算法完成用最少的时间在表中查找值为 x 的元素,若找到将其与后继元素位置想交换,若找不到将其插入表中,并使表中的元素仍然递增有序。

def function(nums, target):low = 0high = len(nums) - 1mid = 0while low <= high:mid = (low + high) // 2if nums[mid] == target:breakif nums[mid] < target:low = mid + 1else:high = mid - 1if nums[mid] == target and mid < len(nums) - 1:nums[mid], nums[mid+1] = nums[mid+1], nums[mid]if low > high:nums.append(0)for i in range(len(nums)-1, high, -1):nums[i] = nums[i-1]nums[low] = target

4、将 n(n > 0) 个整数存放到一维数组 R 中。试设计一个在时间和空间两方面都尽可能高效的算法。将 R 中保存的序列循环左移 p (0<p<n)个位置。

def reverse(nums, start, end):while start < end:nums[start], nums[end] = nums[end], nums[start]start += 1end -= 1print(nums)def function(nums, p):reverse(nums, 0, p-1)reverse(nums, p, len(nums)-1)reverse(nums, 0, len(nums)-1)

5、一个长度为 L 的升序列 S,处在 1/2 个位置的数称为 S 的中位数。S1=(11, 13, 15, 17, 19),S2=(2,  4, 6, 8, 20),现在有两个等长的升序序列 A  = (11, 13, 15, 17, 19) 和 B = (2,  4, 6, 8, 20),试设计一个在时间和空间两个方面都尽可能高效的算法,找出两个序列 A 和 B 的中位数。

6、已知一个整数序列 A = (a0, a1, ……, an-1),其中,0 <= ai < n。若某个元素的数量超过一半,则称之为主元素。请设计一个高效的算法,找出 A = (0, 5, 5, 3, 5, 7, 5, 5) 的主元素。

def function(nums):flag = nums[0]count = 1for i in range(1, len(nums)):flag = nums[i] if count == 0 else flagcount += 1 if flag == nums[i] else -1print(flag)

二、链表

引入头结点后,第一个结点的位置被存放在头结点的指针域中,有点如下:

  • 在链表中的第一个位置和其他位置上的结点操作一致,无须进行特殊处理;
  • 空链表和非空链表的处理一致。

尾插法建表

class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef create_link_list(nums):head = ListNode(0)pointer = headfor i in nums:temp = ListNode(i)pointer.next = temppointer = pointer.nextreturn headcreate_link_list([1, 2, 3, 4, 5])

遍历链表

def print_link(head):pointer = head.nextwhile pointer is not None:print(pointer.val)pointer = pointer.next

1、头插法实现单链表反转或者就地逆置单链表

def function(head):pointer = head.nextp_index = ListNode(0)head = ListNode(0)while pointer is not None:p_index = pointerpointer = pointer.nextp_index.next = head.nexthead.next = p_index

2、设 head 为带头结点的单链表,编写算法实现从尾到头反向输出每个节点的值

def function(head):  # head 链表参照尾插法自己创建,输入列表,输出链表stack = Stack()  # Stack 是作者基于列表封装的类,实现了栈的功能pointer = head.nextwhile pointer is not None:stack.push(pointer.val)pointer = pointer.nextwhile not stack.is_empty():print(stack.pop())

3、有一个带头结点的单链表 head,涉及一个算法使其元素递增有序。

思路:插入排序法实现链表的排序

def function(head):pointer = head.nexthead = ListNode(0)while pointer is not None:p_index = pointerpointer = pointer.nexttemp_index = headwhile temp_index.next is not None and temp_index.next.val < p_index.val:temp_index = temp_index.nextp_index.next = temp_index.nexttemp_index.next = p_index

4、给定两个单链表,编写算法找出两个链表的公共结点。

思路:如果链表有公共结点,那么,两个链表从公共结点到尾结点一定是相同的,所以,先将其中较长的链表遍历至和较短的链表相同长度,然后,同时遍历并判断当前两个链表的结点是否相同。

def getIntersectionNode(headA, headB):countA = 0countB = 0index_A = headAwhile index_A is not None:countA += 1index_A = index_A.nextindex_B = headBwhile index_B is not None:countB += 1index_B = index_B.nextdistance = 0long_link = ListNode(0)short_link = ListNode(0)if countA - countB > 0:distance = countA - countBlong_link = headAshort_link = headBelse:distance = countB - countAlong_link = headBshort_link = headAfor i in range(0, distance):long_link = long_link.nextwhile long_link is not None:if long_link == short_link:return long_linklong_link = long_link.nextshort_link = short_link.nextreturn None

5、请你设计并实现一个满足 LRU(最近最少)使用约束的数据结构

第一部分 顺序表和链表相关推荐

  1. Datawhale组队学习 Task02:顺序表和链表(2天)

    Task02 顺序表和链表(2天) 1. 线性表的定义与操作 1.1 线性表的定义 线性表(Linear List)是由n(n >= 0)个相同类型的数据元素a1,a2,...,an 组成的有序 ...

  2. 顺序表、链表、双向循环链表

    顺序表.链表.双向循环链表 SeqList.h #pragma once #include<stdio.h>#define ListSize 100 //线性表的最大长度 typedef ...

  3. 8.基本数据结构-顺序表和链表

    一.内存 - 计算机的作用:对数据进行存储和运算.首先我们需要知道我们目前使用的计算机都是二进制的计算机,就以为着计算机只可以存储和运算二进制的数据.例如下载好的一部电影,该电影可以存储到计算机中,计 ...

  4. 线性表、顺序表和链表,你还分不清?

    摘要:其实说实话,可能很多人依然分不清线性表,顺序表,和链表之间的区别和联系! 本文分享自华为云社区<程序员必会自己设计线性表(顺序表.链表)>,原文作者:bigsai. 前言 其实说实话 ...

  5. 【顺序表和链表】实现增删查改数据结构 OJ题编程

    目录 线性表 一.顺序表 1.使用顺序表MyArrayList增删查改 MyArrayList.java TestDemo.java 二.链表 1.带头 / 不带头 循环 / 非循环 2.创建链表并访 ...

  6. python列表是顺序表还是链表_Python数据结构与算法(链表使用详解)

    链表 单向链表 p是头节点,指向第一个值,最后一个是伪节点,因为不指向地址. 表元素域elem用来存放具体的数据 链接域next用来存放下一个节点的位置(python中的标识) 变量p指向链表的头节点 ...

  7. java数据结构与算法之顺序表与链表深入分析

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结 ...

  8. 数据结构与算法之线性表(超详细顺序表、链表)

    原创公众号:bigsai 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 通过前面数据结构与算法基础知识我么知道了数据结构的一些概念和重要性,那么我们今天总结下线性表相关的内容 ...

  9. 数据结构之线性表(顺序表和链表)

    线性表 首先线性表的定义就是:零个或多个数据元素的有限序列. 列如高考前每个班级排队照准考证,这个队伍就可以看做一个线性表,大家都井然有序的排着队,是一个有限的序列,一个班就那么几十个人,而且每个人之 ...

最新文章

  1. pytest+allure环境别人电脑运行正常,自己运行不正常几种情况
  2. 我在哪里可以在线找到Android源代码? [关闭]
  3. 修改adb shell在pc端显示的名称
  4. canvas并查集画随机迷宫
  5. php页面增加自选项,php - 添加自定义设置选项卡,Woocommerce的设置客户列表内容 - SO中文参考 - www.soinside.com...
  6. 线程池 Executors2
  7. Jerry开发的SAP note工具
  8. python中字典和集合对象是无序的_Python基础(四):元组、字典和集合
  9. double和float的误区!
  10. python字典合并_Python中如何实现两个字典合并
  11. C++_结构体的定义和使用_结构体数组---C++语言工作笔记025
  12. Swift和R3联手了,跨境支付市场竞争升级
  13. let var const的区别
  14. hdu1708(C++)
  15. 嵌入式C语言(入门必看)
  16. java bmp透明底色_C++ 设置透明背景图片
  17. C语言99乘法口诀函数,99乘法口诀妙用C语言输出
  18. CSS——CSS定位※ ( position )
  19. TokenGazer评级丨MakerDao:去中心化金融趋势确立,项目治理恐有中心化风险
  20. c语言实现数字华容道编程,【JIONEY】掌控版+遥传感器 实现数字华容道小游戏...

热门文章

  1. Navicat如何显示导航窗格
  2. NXP I.MX6ULL芯片介绍以及资料的获取
  3. 4、Prism的使用三
  4. 语音信号的同态处理、倒谱分析和Mel频率倒谱系数
  5. python中有数组吗_python中有数组吗
  6. Arduino学习笔记(5)-- 步进电机转速和方向控制
  7. 记几次 [线上环境] Dubbo 线程池占满原因分析(第三次:GC STW)
  8. Java基础(2)面向对象的理解
  9. 什么是 DNS SPF 记录?
  10. struts2+spring3+hibernate4