2020-09-03

本文详细解析了一个简单的猜数字游戏算法,通过三次迭代改进代码,从初步实现到精简优化,展示了从输入处理到结果输出的完整过程。适用于初学者理解和实践算法。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

每日学习一个算法——猜数字(在下菜鸟,自己练习)

 


题目

小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?

输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。

示例 1:

输入:guess = [1,2,3], answer = [1,2,3]
输出:3
解释:小A 每次都猜对了。

示例 2:

输入:guess = [2,2,3], answer = [3,2,1]
输出:1
解释:小A 只猜对了第二次。
 

限制:

guess的长度 = 3
answer的长度 = 3
guess的元素取值为 {1, 2, 3} 之一。
answer的元素取值为 {1, 2, 3} 之一。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/guess-numbers

一、解题思路

这个题其实蛮简单的,只不过本人是个初学者。

首先依次输入两组数,而后写一个计算有几个相同的数、第几个相同的数的方法,在主方法内引用。

二、更新代码

1.第一遍

代码如下(示例):(第一遍自己写的,后来看了别人是十行就搞定了,我这个菜鸡写了快100,难受)

package SuanFa01;
import java.util.Scanner;
public class Caishuzi {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] str;
        String[] str1;
        boolean flag = false;
        boolean flag1 = false;
        while (true){
            System.out.println("请键盘录入第一组三个数(1-3),中间以空格分隔");
            str = sc.nextLine().split(" ");
            if(str.length==3){
                int b = 0;
                for (int i = 0; i < str.length;i++ ) {
//红色部分有点乱哈,大致意思就是,如果全部通过,就是输入的字符串合格,就返回true,反之就是false。
                    int a = Integer.parseInt(str[i]);
                    if (a >= 1 & a <= 3) {
                        b++;
                    }else{
                        System.out.println("您输入的数字范围不对,请重新输入");
                    }
                }
                if(b==3){
                    flag = true;
                }
            }else{
                System.out.println("您输入的数字个数不对,请重新输入");
            }
//这蓝色部分和红色字体一样,是第二个数组
            System.out.println("请键盘录入第二组三个数(1-3),中间以空格分隔");
            str1 = sc.nextLine().split(" ");
            if(str1.length==3){
                int b = 0;
                for (int i = 0; i < str1.length;i++ ) {
                    int a = Integer.parseInt(str1[i]);
                    if (a >= 1 & a <= 3) {
                        b++;
                    }else{
                        System.out.println("您输入的数字范围不对,请重新输入");
                    }
                }
                if(b==3){
                    flag1 = true;
                }
            }else{
                System.out.println("您输入的数字个数不对,请重新输入");
            }
            if(flag&flag1){
                duiBi(str, str1);
            }
        }
    }
//下面红色字体是一个对比的方法,就是比较两个数组对应的数字是否相同,有几个相同
    public static void duiBi(String[] A, String[] B) {
        int a = 0;
        for (int i = 0; i < A.length; i++) {
            int b = Integer.parseInt(A[i]);//因为之前输入的是字符串,这边是整型数组,所以要转换一下
            int c = Integer.parseInt(B[i]);
            if (b==c) {
                a++;
            }
        }
        switch (a) {
            case 3:
                System.out.println("三次全部答对");
                break;
            case 2:
                System.out.println("二次答对");
                break;
            case 1:
                System.out.println("一次答对");
                break;
            case 0:
                System.out.println("全部错误");
                break;
        }
        //为什么A[i].equalsB[i]不对???
        //之前不知道为什么A[i]==B[i]为什么不能用做判断,后来发现这俩是字符串,要用equals
        int d = 0;
        for (int i = 0; i < A.length; i++) {
            int b = Integer.parseInt(A[i]);
            int c = Integer.parseInt(B[i]);
            if (b==c) {
                d++;
                System.out.println("第" + d + "个猜对了");
            }
        }
    }
}

2.第二遍

代码如下(示例):(这个和第一遍的原理大致相同,只不过把一些没用的去掉了,并且借鉴了别人的一些方法)

package SuanFa01;

import java.util.Scanner;

public class Caishuzi01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请键盘录入第一组三个数(1-3),中间以空格分隔");
            String[] str = sc.nextLine().split(" ");

            System.out.println("请键盘录入第二组三个数(1-3),中间以空格分隔");
            String[] str1 = sc.nextLine().split(" ");
            game(zhuanHuan(str),zhuanHuan(str1));
        }
    }
//还是因为字符串和数组的转换问题,下面红色代码
    public static int[] zhuanHuan(String[] A) {
        int a[] = new int[A.length];
        for (int i = 0; i <A.length ; i++) {
            a[i] = Integer.parseInt(A[i]);
        }
        return a;
    }
    public static int game(int[] guess,int[] answer){
        int r = 0;
        for (int i = 0; i < 3; i++) {
            if(guess[i] == answer[i]) {
                r++;
                System.out.println("第"+(i+1)+"个数相同");
            }
        }
        System.out.println("共"+r+"个数相同");
        return r;
    }
}




3.第三遍

代码如下(示例):后来想想,为什么非要用字符串输入呢,虽然输入省劲了,但是后面转换更费劲了,还不如直接整型数组输入,两下搞完

package SuanFa01;

import java.util.Scanner;

public class Caishuzi02 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int[] a = new int[3];

        int[] b = new int[3];

        System.out.println("请输入第一组的三个数字");

        for (int i = 0; i < 3; i++) {

            System.out.println("请输入第"+(i+1)+"个数字");

            a[i]=sc.nextInt();

        }

        System.out.println("请输入第二组的三个数字");

        for (int i = 0; i < 3; i++) {

            System.out.println("请输入第"+(i+1)+"个数字");

            b[i]=sc.nextInt();

        }

        game(a, b);

    }

    public static int game(int[] guess,int[] answer){

        int r = 0;

        for (int i = 0; i < 3; i++) {

            if(guess[i] == answer[i]) {

                r++;

                System.out.println("第"+(i+1)+"个数相同");

            }

        }

        System.out.println("共"+r+"个数相同");

        return r;

    }

}

总结

小白初学,争取每日一道算法题,一位前辈说,算法题还是得自己多做几遍,做完参考下别人的,慢慢积累。

要使用Pandas读取Excel表格并在特定日期附近添加特殊标记,你可以按照以下步骤操作: 1. **导入所需库**[^1]: ```python import pandas as pd ``` 2. **加载Excel文件**。假设文件名为`data.xlsx`: ```python data = pd.read_excel('data.xlsx') ``` 3. **获取日期列**。如果日期列名为'date',则: ```python date_column = data['date'] ``` 4. **计算特殊日期范围**。这里我们找到2020-09-03前后七天的日期: ```python start_date = date_column[(date_column == '2020-09-03')].index.min() - pd.DateOffset(days=7) end_date = date_column[(date_column == '2020-09-03')].index.min() + pd.DateOffset(days=7) special_dates = date_column[(start_date <= date_column) & (date_column <= end_date)] ``` 5. **在原始数据中添加特殊标记**: ```python data.loc[special_dates.index, 'special_column'] = '特殊' ``` 这里假设创建了一个新的列'special_column'来存储标记。 完整的代码示例: ```python import pandas as pd # Step 2 data = pd.read_excel('data.xlsx') # Step 3 date_column = data['date'] # Step 4 start_date = date_column[date_column == '2020-09-03'].index.min() - pd.DateOffset(days=7) end_date = date_column[date_column == '2020-09-03'].index.min() + pd.DateOffset(days=7) special_dates = date_column[(start_date <= date_column) & (date_column <= end_date)] # Step 5 data.loc[special_dates.index, 'special_column'] = '特殊' # 或者,如果你只想对日期列本身做标记: # special_dates_index = special_dates.tolist() # date_column[special_dates_index] = '特殊' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值