剑指offer:1-4题_string_list

剑指offer刷题总结
第1题:二维数组的查找
题目说明:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
程序
1.循环遍历每一个整数,判断是否等于给定的整数,如果相等则输出存在,否则不存在。

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        for i in range(len(array)):#数组行数
            for j in range(len(array[0])):#数组列数
                if target == array[i][j]:
                    return 'true'
        return 'false'
while True:
    try:
        S=Solution()
        # 字符串转为list
        L=list(eval(raw_input()))
        array=L[1]
        target=L[0]
        print(S.Find(target, array))
    except:
        break

eval()详解
2.从左下角开始查找,已知右边的元素比该元素大,上边的元素比该元素小,所以,target如果等于该元素输出存在,如果小于该元素行数-1,如果大于该元素列数+1,如果出了边界,则说明二维数组中不存在target。

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        rows = len(array) - 1
        cols= len(array[0]) - 1
        i = rows
        j = 0
        while j<=cols and i>=0:
            if targetarray[i][j]:
                j += 1
            else:
                return 'true'
        return 'false'

知识点
创建数组:

import numpy as np
a = np.zeros((3,3))#np.zeros([3,3])  创建全0矩阵
b = np.ones((3,3))#np.ones([3,3])  创建全1矩阵
c = np.full((2,2), 7)#创建二维数组,数组元素全部为7
d = np.eye(2)#创建二维对角数组
e = np.random.random((2,2))#创建二维随机数组

第2题:替换空格
题目说明:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
程序
1.字符串替换方法:s.replace(old, new)。

# -*- coding:utf-8 -*-
class Solution:
    # s 源字符串
    def replaceSpace(self, s):
        # write code here
        s = s.replace(' ', '%20')
        return s

2.遍历替换。

class Solution:
	def replaceSpace(self, s):
		s = list(s)
		for i in range(len(s)):
			if ' ' == s[i]:
				s[i] = '%20'
		return ''.join(s)
# -*- coding:utf-8 -*-
class Solution:
    # s 源字符串
    def replaceSpace(self, s):
        # write code here
        s_new = ''
        for i in s:
            if i == ' ':
                i = '%20'
            s_new = s_new + i
        return s_new

知识点
**字符串(string)**常用方法总结:
1.查找
(1)find()及index():检测某个子串是否包含在主串中,如果存在,返回子串位置下标;如果不存在,返回-1(index()输出异常)。
语法:字符串.find(子串, 开始位置下标, 结束位置下标)/字符串.index(子串, 开始位置下标, 结束位置下标)
rfind()和find()功能相同,但查找方向从右侧开始,rindex()同理。
(2)count():返回某个子串在主串中出现的次数。
语法:字符串.count(子串, 开始位置下标, 结束位置下标)
2.修改
(1)replace():替换
语法:字符串.replace(旧子串, 新子串, 替换次数)
(2)split():按照指定字符分割字符串,返回的是列表,如果分割字符是原有字符的子串,分割后该子串丢失。
语法:字符串.split(分割字符,分割数目)
(3)join():用一个字符或子串合并字符串,即将多个字符串合并成一个新的字符串。
语法:字符/子串.join(字符序列)例子

mylist = ["aa","bb","cc"]#可以处理列表、元组、字符串、字典(字典以key值连接,特点:无序性)
print("...".join(mylist))
# 输出aa...bb...cc

(4)
capitalize():将字符串第一个字符转化成大写;
title():将字符串每个单词首字母转化成大写;
lower():将字符串中大写转小写;
upper():将字符串中小写转大写。
lstrip():删除字符串左侧空白字符;
rstrip():删除字符串右侧空白字符;
strip():删除字符串两侧空白字符。
3.判断
(1)startswith():检查字符串是否以指定子串开头,是则返回True,否则返回False。如果设置开始和结束位置下标,则是在指定范围内检查。
语法:字符串.startswith(子串, 开始位置下标, 结束位置下标)
(2)endswith():检查字符串是否以指定子串结尾,是则返回True,否则返回False。如果设置开始和结束位置下标,则是在指定范围内检查。
语法:字符串.endswith(子串, 开始位置下标, 结束位置下标)
第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
        list = []
        while listNode:
            list.append(listNode.val)
            listNode = listNode.next
        return list[::-1]#切片操作:从后向前输出

第4题:重建二叉树
题目说明:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
程序
前序遍历的第一个值为根结点,对应中序遍历点的下标为记为i,在中序遍历中,该点左侧为根的左子树,该点右侧为根的右子树。本题使用递归思想,分别取前序遍历[1: i+1]和中序遍历[: i]对应左子树继续上一过程,取前序遍历[i+1: ]和中序遍历[i+1: ]对应右子树继续上一过程,最终重建二叉树。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回构造的TreeNode根节点
    def reConstructBinaryTree(self, pre, tin):
        # write code here
        if len(pre) == 0:
            return None
        if len(pre) == 1:
            return TreeNode(pre[0])
        else:
            res = TreeNode(pre[0])
            res.left = self.reConstructBinaryTree(pre[1: tin.index(pre[0]) + 1], tin[: tin.index(pre[0])])
            res.right = self.reConstructBinaryTree(pre[tin.index(pre[0]) + 1: ], tin[tin.index(pre[0]) + 1: ])
        return res

知识点
1.二叉树遍历
2.**列表(list)**常用方法总结:
列表可以一次存储多个变量,且可以为不同数据类型数据。
(1)index():返回指定数据所在位置的下标。
语法:列表.index(数据, 开始位置下标, 结束位置下标)
(2)count():统计指定数据在当前列表中出现的次数。
语法:列表.(数据, 开始位置下标, 结束位置下标)
(3)len():访问列表长度,即列表中数据的个数。
(4)reverse():逆置
(5)sort():排序,默认升序,条件为reverse=True时:降序。
(6)copy():复制
练习题:
题目说明:8位老师,3个办公室,将8位老师随机分配到3个办公室。
程序
8位老师–列表;
3个办公室–列表嵌套;
分配老师到办公室–随机分配,就是把老师名字写入到办公室列表;
验证是否分配成功–打印办公室详细信息。

import random 
teachers = ['小王', '小李', '小包', '小雪', '小钱', '小花', '小唐', '小陆']
offices = [[], [], []]
for name in teachers:
	num = random.randint(0, 2)
	offices[num].append(name)
i = 1
for office in offices:
	print('第{}个办公室的人数是:{},老师分别是:'.format(i, len(office)))
	for name in office:
		print(name)

知识点
格式化:
(1)print('hello,%s and %s') % ('boys', 'girls')
(2)字典形式:print('hello,%(first) and %(second)' % {'first': 'boys', 'second': 'girls'})
(3)format形式:print('hello,{first} and {second}'.format(first = 'boys', second = 'girls'))

参考博客:
剑指offer题解
字符串常用方法

你可能感兴趣的:(剑指offer)