编程交流——第4期

该文详细展示了使用Python进行一系列计算任务,包括计算2的13次方并反转,计算完全平方数的最少数量,生成一维数组及计算方差,并将结果保存至txt文件。此外,还涉及文本数组元素的映射,计算柱状图雨水接引问题,并绘制图形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文本处理和动态规划

任务一、

要求:

(1)计算2的13次方并将数字结果反转(如‘4321’→‘1234’)

(2)用步骤(1)所得结果的最后两位生成新的数字(如‘1123’→‘23’),计算其完全平方数的最少数量(如12 = 4 + 4 + 4,值为3)

(3)依次计算212223,…,212用所得结果生成一个一维数组,并计算其方差

(4)生成一个txt文件,将步骤(3)所得数组和方差保存至txt文件中

任务二、

要求:

(1)读取文本数组中每个元素x进行映射,映射函数为y=x²+2,将所得结果覆写入原txt(如‘[1,2]’→‘[3,6]’)

(2)将新数组每个元素的值视为柱子的高度,底边长为1,紧密排列且无量纲,计算其在降雨之后最多能接多少雨水(两侧无边界)

示例:原始数组[0,1,0,2,1,0,1,3,2,1,2,1]计算雨水时,下图是其表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)

推荐代码格式(Python 版本)

import XXX

# 任务一

class Solution(object):

    def isScramble(self, s1, s2):

        """

        :type s1: str

        :type s2: str

        :rtype: bool

        """

class Solution(object):

    def numSquares(self, n):

        """

        :type n: int

        :rtype: int

        """

# 任务二

class Solution(object):

    def trap(self, height):

        """

        :type height: List[int]

        :rtype: int

        """

开发情况——任务一:

#开发人:dwk

import numpy as np

# 步骤(1):计算2的13次方并将结果反转
result = str(2 ** 13)
reversed_result = result[::-1]
print("反转后的结果:", reversed_result)

# 步骤(2):用步骤(1)的结果的最后两位生成新的数字,并计算完全平方数的最少数量
last_two_digits = int(reversed_result[-2:])
num_squares = 0

while last_two_digits > 0:
    largest_square = int(last_two_digits ** 0.5) ** 2
    num_squares += 1
    last_two_digits -= largest_square

print("完全平方数的最少数量:", num_squares)

# 步骤(3):依次计算步骤(2)的结果,并生成一个一维数组
result_array = []
current_num = int(reversed_result)

while current_num > 0:
    last_two_digits = current_num % 100
    num_squares = 0

    while last_two_digits > 0:
        largest_square = int(last_two_digits ** 0.5) ** 2
        num_squares += 1
        last_two_digits -= largest_square

    result_array.append(num_squares)
    current_num //= 100

print("生成的一维数组:", result_array)

# 步骤(4):生成一个txt文件,将步骤(3)的数组和方差保存至txt文件中
variance = np.var(result_array)

with open("result.txt", "w") as file:
    file.write("数组:\n")
    file.write(str(result_array))
    file.write("\n\n")
    file.write("方差:\n")
    file.write(str(variance))
    file.write("\n")

print("结果已保存至result.txt文件中。")
# 开发人:hyr
# 开发时间:2023/5/8
import math

# Part 1
num = str(2 ** 13)[::-1]  # 计算2的13次方并反转
print("Part 1:", num)

# Part 2
last_two_digits = int(num[:2])
squares = [i**2 for i in range(1, int(math.sqrt(last_two_digits))+1)]
dp = [float('inf') for _ in range(last_two_digits+1)]
dp[0] = 0
for i in range(1, last_two_digits+1):
    for square in squares:
        if i >= square:
            dp[i] = min(dp[i], dp[i-square] + 1)
print("Part 2:", dp[last_two_digits])

# Part 3
arr = [2 ** i for i in range(1, 13)]
mean = sum(arr) / len(arr)
variance = sum((x - mean) ** 2 for x in arr) / len(arr)
print("Part 3:", arr, variance)


# Part 4
with open('result.txt', 'w') as file:
    file.write(f"Array: {arr}\n")
    file.write(f"Variance: {variance}\n")
# -*-coding:utf-8 -*-
"""
作者:XJQ
时间:2023年05月18日
"""
import os
import numpy as np
class Solution1(object):
    # 定义构造方法
    def __init__(self,s1,s2):
        self.s1=s1
        self.s2=s2
    def  isScramble(self):
        num = str(self.s1** self.s2)[::-1]
        print(num)
        num = str(self.s1** self.s2)[::-1][-2:]
        num = int(num)
        cnt = 0
        while num > 0:
            cnt += 1
            num -= int(cnt ** 2)
        if num < 0:
            cnt -= 1
        print(cnt)
        num = str(self.s1 ** self.s2)[::-1][-2:]
x = Solution1(2,13)
x.isScramble()


class Solution2(object):
    def __init__(self,path):
        self.path=path
    def numSquares(self):
        arr = []
        for i in range(12):
            if i > 0:
                arr.append(2 ** i)
        variance = np.var(arr)
        print(arr)
        print("方差是%f"%(variance))
        filename = self.path
        if os.path.exists(filename):
            os.remove(filename)
        with open(filename, 'w') as f:
            f.write(' '.join(map(str, arr)) + '\n')
            f.write(str(variance))
            f.close()
x2=Solution2("result.txt")
x2.numSquares()
# 开发人:zk
# 步骤1
num1 = 2 ** 13   # 计算2的13次方
str_num1 = str(num1)   # 将数字转为字符串
reverse_num1 = str_num1[::-1]   # 反转字符串
print(reverse_num1)

# 步骤2
last_two_digits = int(reverse_num1[0:2])   # 取出最后两位数字
square_num = last_two_digits ** 2   # 计算完全平方数
print(square_num)

# 步骤3
lst = []   # 定义一个空数组
for i in range(1, 12+1):
    num = 2 ** i   # 计算2的i次方
    lst.append(num)   # 将计算结果添加到数组中
print(lst)
import numpy as np   # 引入numpy库,用于计算方差
variance = np.var(lst)   # 计算方差
print(variance)

# 步骤4
file = open("output.txt", "w")   # 打开一个名为output的txt文件,以写入模式打开
file.write("lst: " + str(lst) + "\n")   # 写入数组
file.write("variance: " + str(variance))   # 写入方差
file.close()   # 关闭文件

开发情况——任务二:

# 开发人:dwk
import ast
import matplotlib.pyplot as plt
import numpy as np

array  = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]

# 进行映射计算并覆写到原txt文件
mapped_array = [x**2 + 2 for x in array]

# 计算数组中柱子之间的雨水接收量
def calculate_rainwater(array):
    n = len(array)
    if n < 3:
        return 0

    left_max = [0] * n
    right_max = [0] * n

    left_max[0] = array[0]
    for i in range(1, n):
        left_max[i] = max(left_max[i - 1], array[i])

    right_max[n - 1] = array[n - 1]
    for i in range(n - 2, -1, -1):
        right_max[i] = max(right_max[i + 1], array[i])

    water = 0
    for i in range(n):
        water += min(left_max[i], right_max[i]) - array[i]

    return water


# 计算雨水接收量
rainwater = calculate_rainwater(array)
print("降雨后能接收的最大雨水量:", rainwater)

# 绘制雨水

plt.figure('ori terrain')
x_list = [_ for _ in range(len(array))]  # 构建横坐标
plt.bar(x_list, mapped_array, width=1, color='k')   # 原始地形

plt.figure('terrain with water')
plt.bar(x_list, mapped_array, width=1, color='k')   # 原始地形
plt.bar(x_list, rainwater, width=1, color='b', alpha=0.5)  # 含水地形
plt.show()
# 开发人:hwy
# 开发时间:2023/5/10
import matplotlib.pyplot as plt
import numpy as np

# 读取文本文件
filename = r"F:\第四期编程\text4mission2.txt"
with open(filename, 'r') as f:
    content = f.read()

# 将文本内容转换为列表
lst = eval(content)

# 映射函数
def mapping(x):
    return x ** 2 + 2

# 对每个元素进行映射
lst = [mapping(x) for x in lst]

# 将新列表写回文件
with open(filename, 'w') as f:
    f.write(str(lst))

# 绘制柱状图
fig, ax = plt.subplots()

# 绘制黑色实心柱子
ax.bar(range(len(lst)), lst, width=1.0, color='black')

# 检查是否存在至少一个可以存水的区域
if len(lst) < 3 or max(lst) <= min(lst):
    print("No water can be stored.")
else:
    # 计算每个柱子上方的雨水高度
    left_walls = [0] * len(lst)
    right_walls = [0] * len(lst)
    left_wall = lst[0]
    for i in range(1, len(lst)):
        left_walls[i] = left_wall
        left_wall = max(left_wall, lst[i])
    right_wall = lst[-1]
    for i in range(len(lst)-2, -1, -1):
        right_walls[i] = right_wall
        right_wall = max(right_wall, lst[i])
    water_levels = []
    for i in range(1, len(lst)-1):
        level = min(left_walls[i], right_walls[i]) - lst[i]
        water_levels.append(max(0, level))

    # 绘制蓝色实心柱子
    ax.bar(range(1, len(lst)-1), water_levels, bottom=lst[1:len(lst)-1], width=1.0, color='blue')

    plt.show()
#开发人:xjq
import pandas


def read_tablemethod(filename):
    data = pandas.read_table(filename, header=None, delim_whitespace=True)
    data = data[0][0]
    return data

class Solution3(object):
    def __init__(self,path,txt_name):
        self.path=path
        self.txt_name=txt_name


    def rain_calculate(self):
        data = read_tablemethod(self.path + self.txt_name)
        data = data.strip('[]')
        data = data.split(',')
        print("txt读取的信息是:%s"%(data))
        data = [int(x) for x in data]
        y = np.array(data) ** 2 + 2
        # 计算雨水
        w = 0
        for i in range(1, max(y) + 1):
            index = []
            for j in range(len(y)):
                if y[j] >= i:
                    index.append(j)
            if len(index) > 1:
                for k in range(index[0], index[-1]):
                    if y[k] < i:
                        w = w + 1
        print("收集的水量为%d"%(w))
        y = str(y)
        with open(self.path + self.txt_name, 'w') as f:
            f.write(y + '\n')
            f.close()

path="C:\\Users\\86136\\Desktop\\"
name = "text4mission2.txt"
x3 = Solution3(path,name)
x3.rain_calculate()
# 开发人:zk
(1)
import numpy as np

# 读取文本数组
# with open('data.txt', 'r') as f:
#    data = f.read().splitlines()
data= [0,1,0,2,1,0,1,3,2,1,2,1]

# 映射函数
def map_func(x):
    return str(int(x)**2 + 2)

# 映射并覆写原txt
with open('data.txt', 'w') as f:
    for d in data:
        f.write(map_func(d) + '\n')

(2)
def max_rain_water(heights):
    n = len(heights)
    left_max_heights = [0] * n  # 左侧最高柱子高度
    right_max_heights = [0] * n  # 右侧最高柱子高度

    # 求每个柱子左侧最高柱子高度
    left_max = 0
    for i in range(n):
        left_max_heights[i] = left_max
        left_max = max(left_max, heights[i])

    # 求每个柱子右侧最高柱子高度
    right_max = 0
    for i in range(n-1, -1, -1):
        right_max_heights[i] = right_max
        right_max = max(right_max, heights[i])

    # 计算每个柱子能接多少雨水
    water = 0
    for i in range(n):
        h = min(left_max_heights[i], right_max_heights[i])
        if h > heights[i]:
            water += h - heights[i]

    return water

# 测试
heights = [0,1,0,2,1,0,1,3,2,1,2,1]
print(max_rain_water(heights))  # 输出:6
#开发人:cyf
import numpy as np
f = open("text4mission2.txt", 'r')
data = f.read()
print("data=",data)
# 转换变量类型
arr = np.array(eval(data))
print(arr)
def y(x):
  return x ** 2 + 2
rain = y(arr)
print("映射雨量为",rain)

# 寻找左右边界,删去两侧不积水元素
def cutl(h):
    while h[0] <= h[1] and len(h) >= 3:
     h = np.delete(h, 0)
    else:
     pass
    return h
def cutr(h):
    while h[-1] <= h[-2] and len(h) >= 3:
     h = np.delete(h,-1)
    else:
     pass
    return h
# 下移c个单位并保证最小值为-
def cutt(c, z):
    cuttnum = len(z)
    for k in range(0,cuttnum):
        if z[k] >= c:
           z[k] = z[k]-c
        else:
            z[k] = 0
    return z
#统计水位上升o高度的积雨量
def mount(o, p):
    global ans
    mountnum = len(p)
    for l in range(0, mountnum):
        if p[l] >= o:
            pass
        else:
            ans = ans+o-p[l]
    return ans
#统计总体积雨量
def rm(g):
    global ans
    g = cutl(g)
    g = cutr(g)
    n = len(g)
    while n >= 3:
       hm=min(g[0],g[-1])
       ans = mount(hm,g)
       g = cutt(hm,g)
       g = cutl(g)
       g = cutr(g)
       n = len(g)
    else:
       return ans

ans = 0
c = rm(rain)
print('可积雨量为',c)

#调整输出格式
rainlist = rain.tolist()
print("调整后的映射雨量为",rainlist)
f = open("text4mission2.txt", 'w')
f.write(str(rainlist))
print("保存完毕")
#开发人:lk
import matplotlib.pyplot as plt

ori_list = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]    # 原序列
new_list = []

# 元素映射
for i in ori_list:
    y = i*i+2
    new_list.append(y)
print('映射结果:', new_list)

# 计算可储存水量
water_list = new_list[:]
for i in range(1, len(ori_list)):
    for j in range(i+1, len(ori_list)):
        for k in range(0, i):
            if water_list[i] < water_list[j] and water_list[i] < water_list[k]:
                water_list[i] = min(water_list[j], water_list[k])

# 数据可视化
plt.figure('ori terrain')
x_list = [_ for _ in range(len(ori_list))]  # 构建横坐标
plt.bar(x_list, new_list, width=1, color='k')   # 原始地形

plt.figure('terrain with water')
plt.bar(x_list, new_list, width=1, color='k')   # 原始地形
plt.bar(x_list, water_list, width=1, color='b', alpha=0.5)  # 含水地形
plt.show()

# 计算水量输出
water_volume = []
for i in range(len(ori_list)):
    water_volume.append(water_list[i] - new_list[i])
print('可储存雨水量为:', sum(water_volume))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值