写在开头,这个专栏是记录刷题/学习/求职面试的小号专栏。主要方向约等于是混口饭吃干啥都行,希望能够在学习的过程中有所输出,也能帮助到别人~
废话少说,首先是经典的《剑指offer》系列,题目顺序是参考牛客网,以下都是python实现:剑指Offer_编程题_牛客网www.nowcoder.com
1.二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:举个栗子,数组长这个样子:
[[1,2,3,4,5],
[3,4,5,6,7],
[8,9,10,11,12]]
如果想找数字7,假设从左上角开始找,要么向右边找,要么向下面找(有两个方向要看);
假设右下角开始找,要么向上边找,要么向左边找(有两个方向要看);
假设从右上角开始找,只能选择一个方向,要么比5大的向下找,要么比5小的向左找(只看一个方向);
假设从左下角开始找,只能选择一个方向,要么比8小的向上找,要么比8大的向右找(只看一个方向)。
这样看来,只有一个方向的找起来更容易!所以我们可以从右上角开始(左下角也行没毛病)
找数字7的过程:
[[1,2,3,4,5],
↓
[3,4,5,6,7],
[8,9,10,11,12]]
参考代码如下:
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
len_row = len(array) - 1 # 行的长度范围
len_col = len(array[0]) -1 # 列的长度范围
i = 0 # 从右上角开始,二维数组索引为array[0][len_col]
j = len_col # 用i,j来查找数组中的元素,i对应行,j对应列
while i <= len_row and j >= 0:
if target == array[i][j]:
return True
# 如果没找到且当前array[i][j]数值比target小,继续向下查找
elif target >= array[i][j]:
i += 1
# 如果没找到且当前array[i][j]数值比target大,向 查找
else:
j -= 1
# 搜索到数组边界也没找到target,说明没有,返回false
return False
最后运行结果:为啥运行时间这么久...TAT
2.替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:第一个想到的就是用python中的replace方法:str.replace(old, new[, max]) ,把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
class Solution:
# s 源字符串
def replaceSpace(self, s):
# write code here
s = s.replace(' ', '%20')
return s
感觉这个方法有点,是不是误解了出题者意图,然后又尝试了另一种方法,用split方法分隔字符串,分隔符是空格,这个结果会保存到一个数组中。再用join方法把数组中每一个元素连接起来,连接符是“%20”:
class Solution:
# s 源字符串
def replaceSpace(self, s):
return "%20".join(s.split(' '))
好像变快了一点点,占用内存也变小了~
3. 从尾到头打印链表
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
思路:从头到尾遍历一遍链表,把它所有的值存到一个栈里,利用栈的先入后出特性,完成从尾到头打印。由于这个题里的输出需要时一个列表,所以这里利用列表作为存储结果,每次都存储到列表的第一个位置(伪装是栈),然后将列表返回。
一个丑陋的图示:有被丑到:)
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# 返回从尾部到头部的列表值序列,例如[1,2,3]
def printListFromTailToHead(self, listNode):
# write code here
stack = []
h = listNode # 用h代替listNode遍历
while h: # 停止条件,遍历到了链表的最后一个节点
stack.insert(0, h.val) # 向栈压入数值,模拟栈的push操作
h = h.next # 接着遍历
return stack困了
明天继续更~