day22—编程题

文章目录

  • 1.第一题
    • 1.1题目
    • 1.2思路
    • 1.3解题
  • 2.第二题
    • 2.1题目
    • 2.2思路
    • 2.3解题
  • 3.第二题
    • 3.1题目
    • 3.2思路
    • 3.3解题

1.第一题

1.1题目

描述:
小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3…bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?
输入描述:
对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值. 然后输入n行,每行整数,b1,b2…bn(1≤bi≤n)表示每个怪物的防御力
输出描述:
对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值

1.2思路

  1. 先写一个函数求两个数的最大公约数,使用辗转相除法
  2. 如果怪物的防御力大于小易,就让小易的攻击力加上他的攻击力和怪物的防御力两个值的最大公约数
  3. 如果怪物的防御力小于等于小易,就让小易的攻击力加上怪物的防御力

1.3解题

import java.util.*;
public class Main {
    //求最大公约数
    public static int gdc(int a, int b) {
        int r = a % b;
        while (r != 0) {
            a = b;
            b = r;
            r = a % b;
        }
        return b;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int n = sc.nextInt();
            int a = sc.nextInt();
            int[] arr = new int[n];
            for (int i = 0; i < n; i++) {
                arr[i] = sc.nextInt();
                if (arr[i] > a) {
                    a += gdc(a, arr[i]);
                } else {
                    a += arr[i];
                }
            }
            System.out.println(a);
        }
    }
}

2.第二题

2.1题目

描述:
找出字符串中第一个只出现一次的字符
输入描述:
输入一个非空字符串
输出描述:
输出第一个只出现一次的字符,如果不存在输出-1

2.2思路

  1. 记录每个字符出现的次数
  2. 找到第一次出现一次的字符
  3. 找不到,返回-1

2.3解题

import java.util.*;
public class Main {
    //找到第一个出现一次的字符并返回
    public static void foundChar(String str){
        char[] ch = str.toCharArray();
        int[] count = new int[128];
        //记录字符出现的次数
        for(int i = 0;i < ch.length;i++){
            count[ch[i]]++;
        }
        boolean flg = false;
        for(int i = 0;i < ch.length;i++){
            //找到第一次出现一次的字符
            if(count[ch[i]] == 1){
                System.out.println(ch[i]);
                flg = true;
                break;
            }
        }
        //找不到,返回-1
        if(flg == false){
            System.out.println(-1);
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        foundChar(str);
    }
}

3.第二题

3.1题目

描述:
大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项
输入描述:
一个正整数n
返回值描述:
输出一个正整数

3.2思路

  1. 递归:斐波那契数列的第n项等于第n-1项加上第n-2项
  2. 动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解,在求解斐波那契数过程中,利用动态规划的思想,当我们求解一个复杂问题时(斐波那契数F(n)),会考虑把原问题分解为相对简单的子问题(分解为子问题F(n-1)和F(n-2)),再进行求解,最后得到原问题的解

3.3解题

递归

public class Solution {
    public int Fibonacci(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
}

动态规划1

public class Solution {
    public int Fibonacci(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        int first = 1;
        int second = 1;
        int tmp = 0;
        for(int i = 3;i <= n;i++) {
            tmp = first + second;
            first = second;
            second = tmp;
        }
        return tmp;
    }
}

动态规划2

public class Solution {
    public int Fibonacci(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        int[] dp = new int[n + 1];
        dp[1] = dp[2] = 1;
        for(int i = 3; i <= n;i++){
            dp[i] = dp[i - 1]+ dp[i - 2];
        }
        return dp[n];
    }
}

你可能感兴趣的:(每日一题,算法,java,数据结构)