day19—编程题

Posted 若知hui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day19—编程题相关的知识,希望对你有一定的参考价值。

文章目录

1.第一题

1.1题目

描述:
某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。
小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
注意:本题存在多组输入。输入的 0 表示输入结束,并不用输出结果。
输入描述:
输入文件最多包含 10 组测试数据,每个数据占一行,仅包含一个正整数 n( 1<=n<=100 ),表示小张手上的空汽水瓶数。n=0 表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。

1.2思路

  1. 喝到的汽水数=空瓶子的数/3
  2. 空瓶子的数=空瓶子的数/3+空瓶子的数%3
  3. 如果剩下两个空瓶子可以向老板借一瓶汽水,记得把喝到的汽水数加一

1.3解题

import java.util.*;
public class Main 
    public static int getSum(int num)
        int sum = 0;
        while(num > 1)
            //喝到的汽水的数量
            sum += num / 3;
            //空瓶子的数量
            num = num /3 + num % 3;
            //如果剩下两个空瓶子可以向老板借一瓶汽水
            if(num == 2)
                sum++;
                break;
            
        
        return sum;
    
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        int num;
        //这里是因为最后一个输入0表示结束,不用输出结果
        while((num = sc.nextInt()) != 0)
            System.out.println(getSum(num));
        
        
    

2.第二题

2.1题目

描述:
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符

2.2思路

  1. 将字符串转化为字符串数组
  2. 定义一个二维数组统计当前最长字符串的长度
  3. 如果第i个字符和第j个字符相等,就进行累加
  4. 如果会面出现了更长的子串记得更新最长子串的长度以及最长子串起始的位置
  5. 记得根据输入的两个字符串的长度判断输出结果

2.3解题

import java.util.*;
import java.io.*;
public class Main 
    public static String getMaxStr(String str1, String str2) 
        char[] ch1 = str1.toCharArray();
        char[] ch2 = str2.toCharArray();
        //多增加一行一列,作为辅助状态
        int[][] arr = new int[ch1.length + 1][ch2.length + 1];
        int sumLen = 0;//最长公共子串的长度
        int start = 0;//最长公共子串的起始位置
        //状态:以str1的第i个字符结尾和以str2的第j个字符结尾的最长公共子串的长度
        for (int i = 1; i <= ch1.length; i++) 
            for (int j = 1; j <= ch2.length; j++) 
                //如果第i个字符和第j个字符相等,则进行累加
                if (ch1[i - 1] == ch2[j - 1]) 
                    arr[i][j] = arr[i - 1][j - 1] + 1;
                    if (sumLen < arr[i][j]) 
                        sumLen = arr[i][j];
                        start = i - sumLen;
                    
                
            
        
        return str1.substring(start, start + sumLen);
    
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        String str1 = sc.nextLine();
        String str2 = sc.nextLine();
        if (str1.length() < str2.length()) 
            System.out.println(getMaxStr(str1, str2));
         else 
            System.out.println(getMaxStr(str2, str1));
        
    

day10—编程题

文章目录

1.第一题

1.1题目

描述:
给定一个二维数组board,代表棋盘,其中元素为1的代表是当前玩家的棋子,0表示没有棋子,-1代表是对方玩家的棋子。当一方棋子在横竖斜方向上有连成排的及获胜(及井字棋规则),返回当前玩家是否胜出。

1.2思路

  1. 检查每一行的个数是否可以取胜
  2. 检查每一列的个数是否可以取胜
  3. 检查主对角线的个数是否可以取胜
  4. 检查副对角线的个数是否可以取胜

1.3解题

import java.util.*;
public class Board 
    public boolean checkWon(int[][] board) 
        int N = board.length;
        int sum = 0;
        //检查每一行的个数是否可以获胜
        for (int i = 0; i < N; i++) 
            //计算完每一行后sum要清零
            sum = 0;
            for (int j = 0; j < N; j++) 
                sum += board[i][j];
            
            if (sum == N) 
                return true;
            
        
        //检查每一列的个数是否可以获胜
        for (int i = 0; i < N; i++) 
            //计算完每一列后sum要清零
            sum = 0;
            for (int j = 0; j < N; j++) 
                sum += board[j][i];
            
            if (sum == N) 
                return true;
            
        
        //检查主对角线的个数是否可以获胜
        sum = 0;
        for (int i = 0; i < N; i++) 
            sum += board[i][i];
            if (sum == N) 
                return true;
            
        
        //检查副对角线的个数是否可以获胜
        sum = 0;
        for (int i = 0; i < N; i++) 
            sum += board[i][N - i - 1];
            if (sum == N) 
                return true;
            
        
        //以上四个方式都不可以
        return false;
    

2.第二题

2.1题目

描述:
密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
一、密码长度:
5 分: 小于等于4 个字符
10 分: 5 到7 字符
25 分: 大于等于8 个字符
二、字母:
0 分: 没有字母
10 分: 密码里的字母全都是小(大)写字母
20 分: 密码里的字母符合”大小写混合“
三、数字:
0 分: 没有数字
10 分: 1 个数字
20 分: 大于1 个数字
四、符号:
0 分: 没有符号
10 分: 1 个符号
25 分: 大于1 个符号
五、奖励(只能选符合最多的那一种奖励):
2 分: 字母和数字
3 分: 字母、数字和符号
5 分: 大小写字母、数字和符号
最后的评分标准:
大于等于 90: 非常安全
大于等于 80: 安全(Secure)
大于等于 70: 非常强
大于等于 60: 强(Strong)
大于等于 50: 一般(Average)
大于等于 25: 弱(Weak)
大于等于 0: 非常弱(Very_Weak)
对应输出为:
VERY_SECURE
SECURE
VERY_STRONG
STRONG
AVERAGE
WEAK
VERY_WEAK
请根据输入的密码字符串,进行安全评定
输入描述:
输入一个string的密码
输出描述:
输出密码等级

2.2涉及的相关知识

熟悉阿斯克码表:
大写字母的阿斯克码值为65-90
小写字母的阿斯克码值为97-122
数字的阿斯克码值为48-57

2.3思路

分别统计数字字母符号的得分,然后加上奖励的得分,最后进行评定

2.4解题

import java.util.Scanner;
public class Main 
    //计算密码长度的得分
    public static int getLen(String str) 
        if (str.length() <= 4) 
            return 5;
         else if (str.length() >= 8) 
            return 25;
         else 
            return 10;
        
    
    //计算字母的得分
    public static int getChar(String str) 
        int big = 0;
        int small = 0;
        for (int i = 0; i < str.length(); i++) 
            if (str.charAt(i) >= 65 && str.charAt(i) <= 90) 
                big++;
             else if (str.charAt(i) >= 97 && str.charAt(i) <= 122) 
                small++;
            
        
        if (big == 0 && small == 0) 
            return 0;
         else if (big > 0 && small > 0) 
            return 20;
         else 
            return 10;
        
    
    //计算数字的得分
    public static int getNum(String str) 
        int num = 0;
        for (int i = 0; i < str.length(); i++) 
            if (str.charAt(i) - '0' >= 0 && str.charAt(i) - '0' <= 9) 
                num++;
            
        
        if (num == 1) 
            return 10;
         else if (num > 1) 
            return 20;
         else 
            return 0;
        
    
    //计算符号得分
    public static int getSys(String str) 
        int num = 0;
        for (int i = 0; i < str.length(); i++) 
            if (!(str.charAt(i) >= 65 && str.charAt(i) <= 90) && !(str.charAt(i) >= 97 && str.charAt(i) <= 122) && !(str.charAt(i) - '0' >= 0 && str.charAt(i) - '0' <= 9) ) 
                num++;
            
        
        if (num == 1) 
            return 10;
         else if (num > 1) 
            return 25;
         else 
            return 0;
        
    
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int sum1 = getLen(str);
        int sum2 = getChar(str);
        int sum3 = getNum(str);
        int sum4 = getSys(str);
        int sum = 0;
        //统计最终得分
        if(sum2 == 20 && sum3 >= 10 && sum4 >= 10)
            sum = sum1 + sum2 + sum3 + sum4 + 5;
        else if(sum2 == 10 && sum3 >= 10 && sum4 >= 10)
            sum = sum1 + sum2 + sum3 + sum4 + 3;
        else if(sum2 == 10 && sum3 >= 10)
            sum = sum1 + sum2 + sum3 + sum4 + 2;
        else 
            sum = sum1 + sum2 + sum3 + sum4;
        
        //输出最终结果
        if(sum >= 90)
            System.out.println("VERY_SECURE");
        else if(sum >= 80)
            System.out.println("SECURE");
        else if(sum >= 70)
            System.out.println("VERY_STRONG");
        else if(sum >= 60)
            System.out.println("STRONG");
        else if(sum >= 50)
            System.out.println("AVERAGE");
        else if(sum >= 25)
            System.out.println("WEAK");
        else 
            System.out.println("VERY_WEAK");
        
    

以上是关于day19—编程题的主要内容,如果未能解决你的问题,请参考以下文章

Java面试宝典每日3题:day19

Java面试宝典每日3题:day27

LeetCode刷题笔记-数据结构-day19

Java核心面试宝典Day19你猜HTTP协议会有什么面试题?

Java核心面试宝典Day19你猜HTTP协议会有什么面试题?

LeetCode刷题笔记-数据结构-day19