2021-05-01

#PAT打卡训练8

1008 数组元素循环右移问题 (20 分)

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N−1​​A​0​​A​1​​⋯A​N−M−1​​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

##题解

###题意分析

1.按题目上的要求,可以想象用图像将输入与输出两串数组串了起来(如样例6-5,4-1),这样其实就是一个逆时针转动的轮盘。

2.由于限定了不能用数组去存储以及尽量减少迁移次数,所以我们采用直接在数组内转换的方法。

###要点

1.通过设定一个r=M%N,可以作为循环次数判断以及M,N值是否输入正确。

2.注意temp每一次存储都要存储当前数组最大下标数,并在其它数迁移完后,令其为a[0],便可做到完整的转动工作

###代码

#include<stdio.h>
#define M 200
int main()
{
    int a[M],m,n,i,j,r,c,temp;
    scanf("%d %d",&m,&n);
    r=n%m;
    for(i=0;i<m;i++)
         scanf("%d",&a[i]);
    if(r!=0)
    while(r--)
    {
         temp=a[m-1];
    for(i=m-1;i>0;i--)
        a[i]=a[i-1];
        a[0]=temp;
    }
    for(i=0;i<m-1;i++)
        printf("%d ",a[i]);
        printf("%d",a[m-1]);
    return 0;
}
 

%runfile 'C:/Users/Personal Computer/.spyder-py3/.zonghetu/色标最好看的.py' --wdir ✅ 所有数据文件存在 ✅ 成功加载 31 个省级行政区边界 📅 目标时段:2021-05-01 00:00:00 至 2021-05-01 06:00:00 ⏰ 匹配时次数量:7 • 2021-05-01 00:00 (索引 0) • 2021-05-01 01:00 (索引 1) • 2021-05-01 02:00 (索引 2) • 2021-05-01 03:00 (索引 3) • 2021-05-01 04:00 (索引 4) • 2021-05-01 05:00 (索引 5) • 2021-05-01 06:00 (索引 6) 🎨 开始批量生成气象图(共 7 个时次)... 🖼️ 正在绘制:2021-05-01 00:00 (索引 0) ❌ 绘制时次 0 失败:sel() got multiple values for argument 'method' 🖼️ 正在绘制:2021-05-01 01:00 (索引 1) ❌ 绘制时次 1 失败:sel() got multiple values for argument 'method' 🖼️ 正在绘制:2021-05-01 02:00 (索引 2) ❌ 绘制时次 2 失败:sel() got multiple values for argument 'method' 🖼️ 正在绘制:2021-05-01 03:00 (索引 3) ❌ 绘制时次 3 失败:sel() got multiple values for argument 'method' 🖼️ 正在绘制:2021-05-01 04:00 (索引 4) ❌ 绘制时次 4 失败:sel() got multiple values for argument 'method' 🖼️ 正在绘制:2021-05-01 05:00 (索引 5) ❌ 绘制时次 5 失败:sel() got multiple values for argument 'method' 🖼️ 正在绘制:2021-05-01 06:00 (索引 6) ❌ 绘制时次 6 失败:sel() got multiple values for argument 'method' 🎉 所有时次绘图完成! 📁 输出目录:D:/Data/ECMWF/新疆及周边气象图_终极紧凑色标版
11-15
你遇到的错误: ``` ❌ 绘制时次 X 失败:sel() got multiple values for argument 'method' ``` 这是一个 **xarray 的 `sel()` 方法调用语法错误**,出现在我们重构代码中的 `read_data` 函数--- ## ❌ 错误原因分析 问题出在这段代码: ```python data = ds[var_name].sel( {DIM_NAMES['time']: ds[DIM_NAMES['time']][time_idx]}, {DIM_NAMES['level']: level}, method='nearest' ) ``` ### 📦 xarray `.sel()` 正确语法是: - 所有维度选择应放在 **一个字典中** - 而不是传多个参数(这会变成 positional args) 你现在写成了: ```python sel(dict1, dict2, method=...) # ❌ 错误!两个字典 → 多个位置参数 ``` 应该合并为: ```python sel(dict_all, method=...) # ✅ 正确!一个字典 ``` --- ## ✅ 修复方案:修改 `read_data` 函数 ### 🔧 修复后的 `read_data` 函数如下: ```python def read_data(file_path, var_key, level, time_idx): """通用数据读取函数(已修正 sel 调用方式)""" var_name = VAR_NAMES[var_key] with xr.open_dataset(file_path) as ds: # ✅ 将时间和层次选择合并到同一个字典中 data = ds[var_name].sel( { DIM_NAMES['time']: ds[DIM_NAMES['time']][time_idx], DIM_NAMES['level']: level }, method='nearest' # 注意:method 是关键字参数 ).values data = np.squeeze(data) # 单位转换 if var_key == 'hgt' and CONVERT_UNITS['hgt']: data = data / 9.8 elif var_key == 'temp' and CONVERT_UNITS['temp']: data = data - 273.15 elif var_key == 'rh' and CONVERT_UNITS['rh']: if data.max() <= 1.0: data = data * 100 return data ``` --- ## ✅ 为什么报错?详细解释 假设你的 NetCDF 文件中有变量 `z(pressure_level, valid_time, latitude, longitude)`。 你想选: - `valid_time` → 第 `time_idx` 个时间点 - `pressure_level` → 某个高度层(如 500 hPa) ### ❌ 错误写法(当前): ```python .sel( {'valid_time': times[0]}, # 第一个 dict → 成为第一个 positional arg {'pressure_level': 500}, # 第二个 dict → 第二个 positional arg method='nearest' ) ``` → 等价于:`.sel(dict1, dict2, method=...)` 但 `.sel()` 只接受 **一个位置参数(即 selection 字典)**,其余必须是 keyword-only 参数。 所以 Python 报错:“got multiple values for argument 'method'” —— 实际上是误解了参数结构。 --- ### ✅ 正确写法: ```python .sel( { 'valid_time': times[0], 'pressure_level': 500 }, method='nearest' ) ``` 这才是标准用法。 --- ## ✅ 修改后完整生效示例 ```python # 示例:正确调用 with xr.open_dataset("D:/Data/ECMWF_geopotentia_2021_05.nc") as ds: z_data = ds['z'].sel( { 'valid_time': ds['valid_time'][0], 'pressure_level': 500 }, method='nearest' ) ``` ✅ 成功返回选定时空切片的数据。 --- ## ✅ 额外建议:使用 `.isel()` 更高效(如果 index 已知) 如果你已经知道 `time_idx` 和最近似的 `level_idx`,可以避免 `method='nearest'` 查询,直接用整数索引: ```python # 更快的方法(适用于规则网格) data = ds[var_name].isel( {DIM_NAMES['time']: time_idx} ).sel({DIM_NAMES['level']: level}, method='nearest') ``` 或预计算 level index: ```python level_coord = ds[DIM_NAMES['level']].values level_idx = (np.abs(level_coord - level)).argmin() data = ds[var_name].isel(time=time_idx, pressure_level=level_idx).values ``` 但这不是必须的,`.sel(..., method='nearest')` 在大多数情况下足够快。 --- ## ✅ 最终确认:只需改这一处即可运行! > 只需将 `read_data()` 函数替换为上面修复版本,整个脚本就能正常运行。 --- ## ✅ 修复后预期输出 ``` ✅ 所有数据文件存在 ✅ 成功加载 31 个省级行政区边界 📅 目标时段:2021-05-01 00:00:00 至 2021-05-01 06:00:00 ⏰ 匹配时次数量:7 ... 🎨 开始批量生成气象图(共 7 个时次)... 🖼️ 正在绘制:2021-05-01 00:00 (索引 0) 📥 图片已保存:ECMWF_新疆及周边_2021-05-01_00_00.png 🖼️ 正在绘制:2021-05-01 01:00 (索引 1) 📥 图片已保存:ECMWF_新疆及周边_2021-05-01_01_00.png ... 🎉 所有时次绘图完成! ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值