11.23每日一题

题目链接:https://leetcode.cn/problems/valid-sudoku/description/

题目描述

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
注意
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
空白格用'.'表示。

示例 1
在这里插入图片描述
输入:board =
[[“5”,“3”,“.”,“.”,“7”,“.”,“.”,“.”,“.”]
,[“6”,“.”,“.”,“1”,“9”,“5”,“.”,“.”,“.”]
,[“.”,“9”,“8”,“.”,“.”,“.”,“.”,“6”,“.”]
,[“8”,“.”,“.”,“.”,“6”,“.”,“.”,“.”,“3”]
,[“4”,“.”,“.”,“8”,“.”,“3”,“.”,“.”,“1”]
,[“7”,“.”,“.”,“.”,“2”,“.”,“.”,“.”,“6”]
,[“.”,“6”,“.”,“.”,“.”,“.”,“2”,“8”,“.”]
,[“.”,“.”,“.”,“4”,“1”,“9”,“.”,“.”,“5”]
,[“.”,“.”,“.”,“.”,“8”,“.”,“.”,“7”,“9”]]
输出:true

示例 2
输入:board =
[[“8”,“3”,“.”,“.”,“7”,“.”,“.”,“.”,“.”]
,[“6”,“.”,“.”,“1”,“9”,“5”,“.”,“.”,“.”]
,[“.”,“9”,“8”,“.”,“.”,“.”,“.”,“6”,“.”]
,[“8”,“.”,“.”,“.”,“6”,“.”,“.”,“.”,“3”]
,[“4”,“.”,“.”,“8”,“.”,“3”,“.”,“.”,“1”]
,[“7”,“.”,“.”,“.”,“2”,“.”,“.”,“.”,“6”]
,[“.”,“6”,“.”,“.”,“.”,“.”,“2”,“8”,“.”]
,[“.”,“.”,“.”,“4”,“1”,“9”,“.”,“.”,“5”]
,[“.”,“.”,“.”,“.”,“8”,“.”,“.”,“7”,“9”]]
输出:false
解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。

提示

  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位数字(1-9)或者 ‘.’

Code

解法一:按序遍历

数独有效有三个条件,行、列和九宫格不出现1~9的重复数字,我们可以将每一种条件单独判断,如果三个条件都符合那就是一个有效的数独
这里我就将每一组需要判断的数存放在一个数组里面,每一组数据的值对应它存放数组的索引,当某一个索引超过1的时候,这个数独就是不合格的(有重复数据)
在九宫格的条件判断时,使用(i / 3) + (j / 3) * 3来作为box的顺序,这边举个例子,如下图所示:3~5的数据都是在第二个九宫格里面,他们的横坐标为j,纵坐标为i。根据纵坐标除以三,我们可以知道目标九宫格在某一行的第几个,一行有三个九宫格,所以我们还要知道它前面有几行/几个九宫格,由于数组从0开始记录,(j / 3) * 3就是这个九宫格所在行数之前所有九宫格的数量,相加就是对应九宫格个数

012345678
012345678
012345678
class Solution {
    public boolean isValidSudoku(char[][] board) {
        int[] row;//行
        int[] col;//列
        int[][] boxs = new int[9][9];//九宫格(9个九宫格,一个box有九个位置)
        //题目给出board.length(行) == board[i],length(列) == 9
        //判断行是否合格
        for (int i = 0; i < 9; i++) {
            row = new int[9];
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') {
                    row[board[i][j] -'0' - 1]++;
                    if (row[board[i][j] -'0' - 1] > 1) {
                        return false;
                    }
                }
            }
        }
        //判断列是否合格
        for (int i = 0; i < 9; i++) {
            col = new int[9];
            for (int j = 0; j < 9; j++) {
                if (board[j][i] != '.') {
                    col[board[j][i] -'0' - 1]++;
                    if (col[board[j][i] -'0' - 1] > 1) {
                        return false;
                    }
                }
            }
        }
        //判断九宫格
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                //每九个格子对应一个box,(i / 3) + (j / 3) * 3去对应box的顺序
                if (board[i][j] != '.') {
                    boxs[(i / 3) + (j / 3) * 3][board[i][j] - '0' - 1]++;
                    if (boxs[(i / 3) + (j / 3) * 3][board[i][j] - '0' - 1] > 1) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
}

当然,这三种条件你会发现存在相似的地方,我们可以将他们合并在一起

解法二:优化遍历

就是简单的把上面冗余的代码删减了一下,没有新的技巧

    public boolean isValidSudoku(char[][] board) {
        int[] row;//行
        int[] col;//列
        int[][] boxs = new int[9][9];//九宫格(9个九宫格,一个box有九个位置)
        //题目给出board.length(行) == board[i],length(列) == 9
        for (int i = 0; i < 9; i++) {
            row = new int[9];
            col = new int[9];
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') {
                    //行
                    row[board[i][j] -'0' - 1]++;
                    if (row[board[i][j] -'0' - 1] > 1) {
                        return false;
                    }
                    //九宫格
                    boxs[(i / 3) + (j / 3) * 3][board[i][j] - '0' - 1]++;
                    if (boxs[(i / 3) + (j / 3) * 3][board[i][j] - '0' - 1] > 1) {
                        return false;
                    }
                }
                //列
                if (board[j][i] != '.') {
                    col[board[j][i] -'0' - 1]++;
                    if (col[board[j][i] -'0' - 1] > 1) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
import pandas as pd import numpy as np from prophet import Prophet # 1. 新增:导入评估指标计算所需的库 from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error # 1. 优化数据读取和预处理 def preprocess_data(): # 读取数据 df_items = pd.read_excel(r"D:\虚拟c盘\大学\竞赛\数学建模\2023年C题\C题\附件1.xlsx", engine=&#39;openpyxl&#39;) df_sales = pd.read_excel(r"D:\虚拟c盘\大学\竞赛\数学建模\2023年C题\C题\附件2.xlsx", engine=&#39;openpyxl&#39;) # 合并数据集 df_merged = pd.merge(df_sales, df_items, on=&#39;单品编码&#39;, how=&#39;left&#39;) # 计算金额并处理退货 df_merged[&#39;金额&#39;] = df_merged[&#39;销量(千克)&#39;] * df_merged[&#39;销售单价(元/千克)&#39;] mask = df_merged[&#39;销售类型&#39;] == &#39;退货&#39; df_merged.loc[mask, &#39;金额&#39;] = -df_merged.loc[mask, &#39;金额&#39;] df_merged.loc[mask, &#39;销量(千克)&#39;] = -df_merged.loc[mask, &#39;销量(千克)&#39;] return df_merged, df_items # 2. 优化数据聚合和透视 def create_pivot_tables(df_merged, df_items): # 计算每日指标 daily_metrics = df_merged.groupby([&#39;单品编码&#39;, &#39;单品名称&#39;, &#39;销售日期&#39;]).agg( 平均价格=(&#39;销售单价(元/千克)&#39;, &#39;mean&#39;), 总销量=(&#39;销量(千克)&#39;, &#39;sum&#39;), 总金额=(&#39;金额&#39;, &#39;sum&#39;) ).reset_index() # 计算退货率 return_rate = df_merged.groupby(&#39;单品编码&#39;).apply( lambda x: x[x[&#39;销售类型&#39;]==&#39;退货&#39;][&#39;金额&#39;].sum() / x[x[&#39;销售类型&#39;]==&#39;销售&#39;][&#39;金额&#39;].sum() if x[x[&#39;销售类型&#39;]==&#39;销售&#39;][&#39;金额&#39;].sum() != 0 else 0 ).reset_index(name=&#39;退货率&#39;) # 创建透视表 pivot_func = lambda metric: daily_metrics.pivot_table( index=[&#39;单品编码&#39;, &#39;单品名称&#39;], columns=&#39;销售日期&#39;, values=metric, fill_value=0 ).reset_index() price_pivot = pivot_func(&#39;平均价格&#39;) vol_pivot = pivot_func(&#39;总销量&#39;) sales_pivot = pivot_func(&#39;总金额&#39;) # 合并品类和退货率信息 final_dfs = {} for df, name in zip([price_pivot, vol_pivot, sales_pivot], [&#39;price&#39;, &#39;vol&#39;, &#39;sales&#39;]): result = pd.merge( df_items[[&#39;单品编码&#39;, &#39;单品名称&#39;, &#39;分类名称&#39;]], return_rate, on=&#39;单品编码&#39;, how=&#39;left&#39; ) final_dfs[name] = pd.merge( result, df, on=[&#39;单品编码&#39;, &#39;单品名称&#39;], how=&#39;left&#39; ) return final_dfs # 3. 优化文件保存 def save_results(final_dfs): final_dfs[&#39;price&#39;].to_excel( r&#39;D:\虚拟c盘\大学\竞赛\数学建模\2023年C题\C235问题二output_price.xlsx&#39;, index=False, engine=&#39;openpyxl&#39; ) final_dfs[&#39;vol&#39;].to_excel( r&#39;D:\虚拟c盘\大学\竞赛\数学建模\2023年C题\C235问题二output_vol.xlsx&#39;, index=False, engine=&#39;openpyxl&#39; ) final_dfs[&#39;sales&#39;].to_excel( r&#39;D:\虚拟c盘\大学\竞赛\数学建模\2023年C题\C235问题二output_sales.xlsx&#39;, index=False, engine=&#39;openpyxl&#39; ) # 4. 新增:定义模型性能评估函数 def evaluate_prophet_performance(y_true, y_pred): """计算Prophet模型预测的R², MAE和RMSE。""" r2 = r2_score(y_true, y_pred) mae = mean_absolute_error(y_true, y_pred) rmse = np.sqrt(mean_squared_error(y_true, y_pred)) return r2, mae, rmse # 5. 修改:优化Prophet分析流程并集成评估 def prophet_analysis(): # 读取数据并重命名列 # 假设&#39;预处理后的数据表.xlsx&#39;中,第一列是日期&#39;ds&#39;,后续列是各个品类的销售数据 input_df_sales = pd.read_excel( r"D:\虚拟c盘\大学\竞赛\数学建模\2023年C题\C题\预处理后的数据表.xlsx", sheet_name="Sheet1" ).rename(columns={&#39;销售日期&#39;: &#39;ds&#39;}) df_price = pd.read_excel( r"D:\虚拟c盘\大学\竞赛\数学建模\2023年C题\C题\p3_预处理.xlsx" ).rename(columns={&#39;销售日期&#39;: &#39;ds&#39;}) # 用于存储最终评估结果的列表 evaluation_results = [] # 分析每个品类 for col in input_df_sales.columns[1:]: # 准备数据 df_sales = input_df_sales[[&#39;ds&#39;, col]].rename(columns={col: &#39;y&#39;}) df_sales = df_sales[df_sales[&#39;y&#39;] > 0] merged_df = pd.merge(df_sales, df_price, on=&#39;ds&#39;) # 初始化模型 model = Prophet( yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=False ) model.add_country_holidays(country_name=&#39;CN&#39;) # 动态添加回归量 # 假设df_price中包含与品类名相同的列作为回归量 if col in df_price.columns: model.add_regressor(col) # 训练模型 model.fit(merged_df) # 预测(仅对训练数据进行预测以评估拟合水平) future = model.make_future_dataframe(periods=0) future = pd.merge(future, df_price, on=&#39;ds&#39;) forecast = model.predict(future) # 评估模型性能 y_true = merged_df[&#39;y&#39;] y_pred = forecast[&#39;yhat&#39;] r2, mae, rmse = evaluate_prophet_performance(y_true, y_pred) # 将结果存入列表 evaluation_results.append({ &#39;品类名称&#39;: col, &#39;R²&#39;: r2, &#39;MAE&#39;: mae, &#39;RMSE&#39;: rmse }) print(f"已完成对品类 &#39;{col}&#39; 的分析和评估。") # 将结果列表转换为DataFrame results_df = pd.DataFrame(evaluation_results) results_df = results_df.set_index(&#39;品类名称&#39;) # 将品类名称设为索引 return results_df # 6. 优化成本利润率计算 def calculate_profit_margin(): # 读取数据 price_df = pd.read_excel( r&#39;D:\虚拟c盘\大学\竞赛\数学建模\2023年C题\C235问题二output_price.xlsx&#39;, engine=&#39;openpyxl&#39; ) cost_df = pd.read_excel( r"D:\虚拟c盘\大学\竞赛\数学建模\2023年C题\C题\附件3.xlsx", engine=&#39;openpyxl&#39; ) # 转换成本数据为宽格式 pivot_cost = cost_df.pivot_table( index=&#39;单品编码&#39;, columns=&#39;日期&#39;, values=&#39;批发价格(元/千克)&#39;, fill_value=0 ).reset_index() # 合并价格和成本数据 merged_df = pd.merge( price_df[[&#39;单品编码&#39;]], pivot_cost, on=&#39;单品编码&#39;, how=&#39;left&#39; ) # 计算成本利润率 date_cols = [col for col in price_df.columns if isinstance(col, pd.Timestamp)] for date in date_cols: if date in merged_df: # 确保分母不为0 price_series = price_df[date] cost_series = merged_df[date] # 使用np.divide来安全地处理除以0的情况 margin = np.divide(price_series - cost_series, cost_series, where=cost_series!=0) merged_df[date] = margin merged_df[date] = merged_df[date].replace([np.inf, -np.inf], np.nan) # 替换无穷大值 # 保存结果 merged_df.to_excel( r&#39;D:\虚拟c盘\大学\竞赛\数学建模\2023年C题\C235问题二cost_profit_margin.xlsx&#39;, index=False, engine=&#39;openpyxl&#39; ) return merged_df # 主流程 def main(): # 数据预处理 # df_merged, df_items = preprocess_data() # 创建透视表 # final_dfs = create_pivot_tables(df_merged, df_items) # 保存结果 # save_results(final_dfs) # Prophet分析与评估 prophet_results_df = prophet_analysis() # 按照图片格式输出结果 print("\n表3 各品类蔬菜的 Prophet 模型拟合水平") # 将DataFrame中的数值四舍五入到小数点后两位 print(prophet_results_df.round(2)) # 计算成本利润率 # profit_margin_df = calculate_profit_margin() # print("\n已完成成本利润率计算并保存文件。") if __name__ == "__main__": main()
08-07
### 寻找Postman 11.23.3版本的中文安装包 对于希望获取特定版本如Postman 11.23.3中文版的用户而言,直接从官方渠道可能无法满足需求,因为官方通常只提供最新稳定版本的下载链接。然而,可以通过其他途径实现这一目标。 #### 方法一:通过GitHub上的汉化项目获得 考虑到官方并不总是提供旧版本的本地化支持,可以考虑访问专门针对Postman进行汉化的开源项目页面,例如hlmd/Postman-cn,在此平台上查找适用于11.23.3版本的汉化补丁[^1]。需要注意的是,应当仔细核对所选汉化包的具体适用范围,确保其能够应用于指定的目标版本上。 #### 方法二:手动汉化现有英文版本 另一种方式是从官方网站或其他可信来源下载Postman 11.23.3原始英文版本,之后按照既定流程完成软件本身的安装过程。接着依照上述提及的方法三中的指导说明,即不启动程序的情况下定位至Postman的应用数据存储位置(C:\Users\<您的用户名>\AppData\Local\Postman),并将事先准备好的、与该版本相匹配的&#39;.app.zip&#39;格式汉化文件解压后覆盖原有的&#39;app&#39;目录结构[^2]。最后一步则是重新打开Postman验证是否成功切换到了简体中文环境。 #### 注意事项 在整个过程中务必保持谨慎态度对待不同组件之间的兼容性问题;另外值得注意的一点是,为了防止因频繁更新而导致之前所做的修改被撤销,建议暂时禁用客户端内部设置里的自动升级选项[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伊天凌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值