day13—编程题

Posted 若知hui

tags:

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

文章目录

1.第一题

1.1题目

描述:
在命令行输入如下命令:
xcopy /s c:\\ d:\\e,
各个参数如下:
参数1:命令字xcopy
参数2:字符串/s
参数3:字符串c:\\
参数4: 字符串d:\\e
请编写一个参数解析程序,实现将命令行各个参数解析出来。
解析规则:
(1)参数分隔符为空格
(2)对于用""包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s “C:\\program files” "d:“时,参数仍然是4个,第3个参数应该是字符串C:\\program files,而不是C:\\program,注意输出参数时,需要将”"去掉,引号不存在嵌套情况。
(3)参数不定长
(4)输入由用例保证,不会出现不符合要求的输入
输入描述:
输入一行字符串,可以有空格
输出描述:
输出参数个数,分解后的参数,每个参数都独占一行

1.2思路

  1. 通过除掉双引号里面的空格的数目统计字符串的数目
  2. 遍历输入的字符串,依次打印每一个字符,定义一个变量让其可以在遇到双引号的时候发生变化,如果遇到空格并且是双引号里面的就打印,如果遇到空格并且是不是双引号里面的就换行

1.3解题

import java.util.Scanner;
public class Main 
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int count = 0;
        for (int i = 0; i < str.length(); i++) 
            //碰到双引号就直接遍历,不管是不是空格
            if (str.charAt(i) == '"') 
                i++;
                //知道碰到第二个双引号才停止遍历
                while ( str.charAt(i) != '"') 
                    i++;
                
            
            if (str.charAt(i) == ' ') 
                count++;
            
        
        //字符串的总数等于空格的数(不算双引号里面的)加一
        System.out.println(count + 1);
        //定义一个变量让其可以在遇到双引号的时候发生变化
        int flg = 1;
        for (int i = 0; i < str.length(); i++) 
            if (str.charAt(i) == '"') 
                //遇到第一个双引号就变成0,再次遇到双引号就变成1
                flg ^= 1;
             else if (str.charAt(i) == ' ' && flg == 0) 
                //如果遇到空格并且是双引号里面的就打印
                System.out.print(str.charAt(i));
             else if (str.charAt(i) == ' ' && flg == 1) 
                //如果遇到空格并且是不是双引号里面的就换行
                System.out.println();
             else 
                System.out.print(str.charAt(i));
            
        
    

2.第二题

2.1题目

描述:
小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3…这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。
例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板
输入描述:
输入为一行,有两个整数N,M,以空格隔开。 (4 ≤ N ≤ 100000) (N ≤ M ≤ 100000)
输出描述:
输出小易最少需要跳跃的步数,如果不能到达输出-1

2.2涉及的相关知识

动态规划是指通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划常常适用于有重叠子问题和最优子结构性质的问题

包装类:
基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647

顺序表:ArrayList
add() 将元素插入到指定位置的 arraylist 中
get() 通过索引值获取 arraylist 中的元素
size() 返回 arraylist 里元素数量

2.3思路

  1. 写一个函数求得一个数的所有约数(使用顺序表)
  2. 将1-m个石板看成数组,将数组中的所有数初始化为同一个不可能是他跳跃所需要的步数的数,从起点开始对数组进行遍历,求i的所有约数
  3. 更新能到达位置的最小步数,如果还没有到达过则更新为此时位置的最小步数 + 1,如果是到达过的就更新为 min(已记录的最小步数,此处的最小步数 + 1))
  4. 最后如果还是最开始初始化的那个数,就说明不能到达;如果不是就返回所求台阶当前数组记录的数

2.4解题

import java.util.*;
public class Main 
    //求一个数的所有约数
    public static List<Integer> div(int n) 
    	//list中存放的是整形元素
        List<Integer> list = new ArrayList<>();
        for (int i = 2; i <= Math.sqrt(n); i++) 
            if (n % i == 0) 
                //如果这个数是所求的数的约数,就把它放在顺序表中
                list.add(i);
                if (n / i != i) 
                    //如果这个数是所求的数的约数并且不是已经放过的数,也把它放在顺序表中
                    list.add(n / i);
                
            
        
        return list;
    
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] arr = new int[m + 1];
        for (int i = 0; i < arr.length; i++) 
            //将数组中的所有数初始化为同一个不可能是他跳跃所需要的步数的数
            //Integer.MAX_VALUE=2147483647
            arr[i] = Integer.MAX_VALUE;
        
        //将起始的台阶的地方的修改为0
        arr[n] = 0;
        for (int i = n; i < m; i++) 
            if (arr[i] == Integer.MAX_VALUE) 
                continue;
            
            //i表示当前所在的台阶数
            List<Integer> list = div(i);
            for (int j = 0; j < list.size(); j++) 
                //step表示每一步可以跳几个台阶
                int step = list.get(j);
                //i + step <= m保证数组不越界
                if (i + step <= m && arr[i + step] != Integer.MAX_VALUE) 
                    arr[i + step] = Math.min(arr[i + step], arr[i] + 1);
                 else if (i + step <= m) 
                    arr[i + step] = arr[i] + 1;
                
            
        
        if (arr[m] == Integer.MAX_VALUE) 
            System.out.println(-1);
         else 
            System.out.println(arr[m]);
        
    

day16—编程题

文章目录

1.第一题

1.1题目

描述:
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
输入n,请输出n以内(含n)完全数的个数。
输入描述:
输入一个数字n
输出描述:
输出不超过n的完全数的个数

1.2思路

  1. 写一个函数专门求一个数的约数
  2. 从2开始遍历输入的数之前的所有数
  3. 将这个数的所有约数全部加起来看是不是等于他本身,如果相等结果值就加1

1.3解题

import java.util.*;
public class Main 
    //求一个数的约数
    public static List<Integer> div(int n)
        List<Integer> list = new ArrayList<>();
        for(int i = 2; i <= Math.sqrt(n);i++)
            if(n % i == 0)
                list.add(i);
                if( n / i != i)
                    list.add(n/i);
                
            
        
        return list;
    
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int count = 0;
        //由于完全数的约数的和是要出去该数本身的,而1的约数只有1,所以要从2开始
        for(int i = 2;i <= n;i++)
            List<Integer> list = div(i);
            int ret = 0;
            //将这个数除去1和他本身的约数全部加起来
            for(int j = 0;j < list.size();j++)
                ret += list.get(j);
            
            //如果这个数除去1和他本身的约数全部加起来再加上1等于他本身,就让count++
            if(ret + 1 == i)
                count++;
            
            //这里记得每统计完一个数,ret要置为0
            ret = 0;
        
        System.out.println(count);
    

2.第二题

2.1题目

描述:
扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王)
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-joker JOKER
请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR
基本规则:
(1)输入每手牌可能是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;
(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子)
(3)大小规则跟大家平时了解的常见规则相同,个子,对子,三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;
(4)输入的两手牌不会出现相等的情况。
提示:
(1)除了炸弹和对王之外,其他必须同类型比较。
(2)输入已经保证合法性,不用检查输入是否是合法的牌。
(3)输入的顺子已经经过从小到大排序,因此不用再排序了
输入描述:
输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如4 4 4 4-joker JOKER。
输出描述:
输出两手牌中较大的那手,不含连接符,扑克牌顺序不变,仍以空格隔开;如果不存在比较关系则输出ERROR

2.2涉及的相关知识

public String substring(int beginIndex, int endIndex)
beginIndex:起始索引(包括)
endIndex:终止索引(不包括)
返回值:String

int indexOf(String str)
返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1

split() 方法根据匹配给定的正则表达式来拆分字符串
public String[] split(String regex, int limit)
regex:正则表达式分隔符
limit:分割的份数

equals() 方法用于判断 Number 对象与方法的参数进是否相等
public boolean equals(Object o)
参数: 任何对象
返回值:如 Number 对象不为 Null,且与方法的参数类型与数值都相等返回 True,否则返回 False

2.2思路

  1. 将输入的这个字符串用-分隔开并存放在字符串数组中,然后将每一方的牌用空格隔开也存放在字符串数组中
  2. 判断哪一方的牌大就输出
  3. 如果有任意一方的牌是对王,则输出对王;如果两方的字符串长度相等,比较两个字符串数组第一个字符在给定的字符串中出现的位置的大小将大的输出;考虑一方有炸弹的情况;如果都没有就输出ERROR

2.3解题

import java.util.*;
public class Main 
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        //将str这个字符串用-分隔开并存放在字符串数组中
        String[] pp = str.split("-");
        String[] p1 = pp[0].split(" ");
        String[] p2 = pp[1].split(" ");
        String p = "34567891JQKA2";
        //如果有任意一方的牌是对王,则输出对王
        if (pp[0].equals("joker JOKER") || pp[1].equals("joker JOKER")) 
            System.out.println("joker JOKER");
         else if (p1.length == p2.length) 
            //比较两个字符串数组第一个字符在给定的字符串中出现的位置的大小
            if(p.indexOf(p1[0].substring(0,1)) > p.indexOf(p2[0].substring(0,1)))
                System.out.println(pp[0]);
            else
                System.out.println(pp[1]);  
            
         else if (p1.length == 4) 
            //考虑有一方是有炸弹的情况
            System.out.println(pp[0]);
         else if (p2.length == 4) 
            System.out.println(pp[1]);
         else
            System.out.println("ERROR");
        
    

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

day01

# Day13-Java基础

day01Java基础语法

Java基础面试每日3题:day13

Java核心面试宝典Day13面试官最爱问的“进程”面试题

Java核心面试宝典Day13面试官最爱问的“进程”面试题