300分钟搞定算法面试之常用数据结构

本文旨在通过深入探讨数组和字符串这两种常用数据结构,帮助读者提高算法面试的准备。文章介绍了数组的定义、初始化及动态数组的概念,并列举了几道相关编程题,如寻找数组的中心索引、判断最大数是否至少是其他数字两倍等。接着,文章讨论了字符串的特性,包括字符串的不可修改性,并给出了几个字符串处理题目的解法,如二进制求和、实现strStr()函数等。通过对这些实例的解析,鼓励读者深入思考问题的本质,提升编程能力。
摘要由CSDN通过智能技术生成

       很多时候看到题目,如果你认真的思考,大都会得到一个直观的思路,跟着这个思路做会得到一个结果。但这只是第一步,很多时候first thought的结果并非最优的,甚至会有很多冗余。这个时候我们不能满足于仅仅跑通代码,得到一个预期的输出就ok了。否则我们很难得到有效的进步。我认为我们要再次审题,再次审视自己的代码,看看哪些地方的计算有冗余,可以优化,看看哪些概念可以转换,很多时候你换个角度理解,就会发现不同的角度竟然可以更高效的解决相同的问题。 

     每道题目都会有多种解法,希望自己在练习时都能深入去思考,思考问题的本质在哪里。当然前提是打好基本功。

好了,唠完开始上题。以下很多题目来自leetcode

常用的数据结构 包括 数组、字符串、链表、队列、栈、树。下面会逐一回顾和举例。

一、数组

用于按顺序存储元素的集合。元素可以随机存取,因为数组中元素可通过索引访问。存取的时间复杂度为O(1)

数组可以是一维,也可以是多维的。 一维数组也称为线性数组。

以下代码简单说明数组的基本用法

1、数组定义,初始化

int[] a0 = new int[5];

int[] a1 = {1,2,3};

以上为两种初始化方法。

2、数组访问

for(int i=0;i<a0.length;i++)

     System.out.println( a1[i] )

以上数组的定义都是固定容量,即初始化时指定了数组大小。这种形式有时很不方便。

因此大多数语言都提供了内置的动态数组,它仍是随机存取的列表数据结构,但大小是可变的。

如c++ 中的vector java中的ArrayList C#中的List<> 以及python中的列表list

以下是一些数组相关的代码编程题,皆来自leetcode 

题一 

给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法。

我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。

如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。

例如:

输入: 
nums = [1, 7, 3, 6, 5, 6]
输出: 3  解释 :索引3 (nums[3] = 6) 的左侧数之和(1 + 7 + 3 = 11),与右侧数之和(5 + 6 = 11)相等。
同时, 3 也是第一个符合要求的中心索引。

为了练习python,以下全部用python语言编写

   方法一 暴力破解, 遍历所有情况 ,时间复杂度O(n*n)
    def pivotIndex(nums):  
        if nums == None:
             return -1
         for i in range(len(nums)):
             left,right =0,0
             for j in range(i):
                 left += int(nums[j])
             for k in range(i+1,len(nums)):
                 right += int(nums[k])
             if left == right:
                 return i

         return -1
    
        #方法一可以解决问题,但显然效率太低,计算有冗余,我们要想办法减少计算冗余,提升算法效率
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值