【每日一题】24.10.7 - 24.10.13

在这里插入图片描述
在这里插入图片描述

个人主页:C_GUIQU
归属专栏:每日一题

10.7 Fizz Buzz 经典问题

1. 题目

Fizz Buzz 经典问题

在这里插入图片描述

2. 解题思路

【法1】逻辑硬解:按照题目逻辑分四种情况,用if else 判断即可。

【法2】switch语句无脑判断:跳出思维逻辑,多引入一个变量,懒人做法。

【法3】if条件表达式判断:这里需要注意的是逻辑与运算符(&&)的运用,只有都为真,整个表达式的值才为真,这里可以不单独判断同时被3和5整除的情况。

【法4】条件运算符(三元运算符):需要一些额外操作,且用到三元条件运算符,此方法相对来说最简单,代码量最少。

3. 代码实现(AC_Code)

  • C++

法1

#include <iostream>

using namespace std;

int main()
{
    int N;
    cin >> N;

    if(N % 3 == 0)
    {
        if(N % 5 == 0)
            cout << "FizzBuzz" << endl;
        else
            cout << "Fizz" << endl;
    }
    else if(N % 5 == 0)
        cout << "Buzz" << endl;
    else
        cout << N << endl;

    return 0;
}

法2

#include <iostream>

using namespace std;

int main()
{
    int N,a = 0;
    cin >> N;

    if(N % 3 == 0)
        a = 1;
    if(N % 5 == 0)
        a = 2;
    if(N % 3 == 0 && N % 5 == 0)
        a = 3;
    
    switch(a)
    {
        case 0:
            cout << N << endl;
            break;
        case 1:
            cout << "Fizz" << endl;
            break;
        case 2:
            cout << "Buzz" << endl;
            break;
        case 3:
            cout << "FizzBuzz" << endl;
            break;
    }

    return 0;
}

法3

#include <iostream>

using namespace std;

int main()
{
    int N;
    cin >> N;

    if(!(N % 3))
        cout << "Fizz";
    if(!(N % 5))
        cout << "Buzz";
    if(N % 3 && N % 5)
        cout << N << endl;

    return 0;
}
  • Java

法4

import java.io.BufferedInputStream;   // 位于java.io包中,这个类用于提供对输入流的缓冲功能
import java.util.Scanner;

public class Main {

    static Scanner sc = new Scanner(new BufferedInputStream(System.in, 128));

    public static void main(String[] args) {
        int n = sc.nextInt();
        System.out.print(n % 3 == 0 && n % 5 == 0 ? "FizzBuzz" : n % 5 == 0 ? "Buzz" : n % 3 == 0 ? "Fizz" : n);
    }

}

10.8 确定字符串是否是另一个的排列

1. 题目

确定字符串是否是另一个的排列

在这里插入图片描述
在这里插入图片描述

2. 解题思路

题目核心要求:理解字符串排列,判断str2是否为str1的排列。

排列:如果将 str1的字符拆分开,重新排列后再拼接起来,能够得到str2,那么就说字符串str2是字符串str1的排列。(不忽略大小写)

第一步:将str1、str2分别进行冒泡排序(这里按照从小到大排序)。

第二步:判断两个字符是否相等。

3. 代码实现(AC_Code)

  • C++
#include <iostream>
#include <cstring>   //包含 strlen 函数 

using namespace std;

int main()
{
    // 定义有长度限制的字符数组
    char str1[100];
    char str2[100];

    cin >> str1 >> str2;

    // 冒泡排序:将str1排序
    for(int i = 0; i < strlen(str1) - 1; i++)
    {
        // 最后i个元素已经排序好,不用重复遍历
        for(int j = 0; j < strlen(str1) - 1 - i; j++)
        {
            if(str1[j+1] < str1[j])
            {
                char temp = str1[j];
                str1[j] = str1[j + 1];
                str1[j + 1] = temp;
            }
        }
    }

    // 冒泡排序:将str2排序
    for(int i = 0; i < strlen(str2) - 1; i++)
    {
        // 最后i个元素已经排序好,不用重复遍历
        for(int j = 0; j < strlen(str2) - 1 - i; j++)
        {
            if(str2[j+1] < str2[j])
            {
                char temp = str2[j];
                str2[j] = str2[j + 1];
                str2[j + 1] = temp;
            }
        }
    }

	
    // 用strcmp函数判断两个字符是否相等
    if(strcmp(str1,str2) == 0)
    	cout << "YES" << endl;
    else
        cout << "NO" << endl;

    return 0;
}
  • Java
import java.util.Scanner;
import java.util.Arrays;

public class Main {
    // 冒泡排序
    public static void sort(char[] array,int n) {
        for(int i = 0; i < n - 1; i++) {
            for(int j = 0; j < n - 1 - i; j++) {
                if(array[j + 1] < array[j]) {
                    char temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        // 输入两行字符串
        String str1 = scan.nextLine();
        String str2 = scan.nextLine();

        // Java中的字符串是不可变的,所以我们需要将输入的字符串转换为字符数组来执行排序操作
        char[] s1 = str1.toCharArray();
        char[] s2 = str2.toCharArray();

        // 排序
        sort(s1,str1.length());
        sort(s2,str2.length());

        // 将排序后的字符数组转换为字符串
        str1 = new String(s1);
        str2 = new String(s2);

        // 判断字符串是否相等
        if(str1.equals(str2))
            System.out.println("YES");
        else
            System.out.println("NO");
            
        scan.close();
    }
}

10.9 压缩字符串

1. 题目

压缩字符串

在这里插入图片描述

2. 解题思路

  1. 定义一个函数compress_string,接收一个字符串s作为参数。

  2. 检查字符串是否为空,如果为空,返回"NO"。

  3. 初始化一个空字符串compressed用于存储压缩过程中的字符串,以及一个计数器count用于记录字符重复的次数。

  4. 遍历字符串,比较当前字符与前一个字符是否相同,如果相同,计数器加1;如果不同,将前一个字符和计数器(如果计数器大于1)添加到compressed字符串中,并重置计数器。

  5. 遍历结束后,处理最后一个字符,确保它也被添加到compressed字符串中。

  6. 构造最终的压缩字符串final_compressed,遍历原始字符串,计算每个字符的重复次数,并构建压缩字符串。

  7. 比较最终压缩字符串的长度与原始字符串的长度,如果压缩后的长度更短,返回压缩字符串;否则返回"NO"。

  8. 在main函数中,从标准输入读取一个字符串,调用compress_string函数,并输出结果。

3. 代码实现(AC_Code)

  • C++
#include <iostream>
#include <string>

using namespace std;

// compress_string函数用于压缩输入字符串
string compress_string(const string& s)
{
    // 如果字符串为空,返回"NO"
    if(s.empty()) return "NO";
    
    // 初始化压缩后的字符串和计数器
    string compressed = "";
    int count = 1;
    char prev_char = s[0]; // 上一个字符初始化为字符串的第一个字符
    
    // 遍历字符串,从第二个字符开始
    for(int i =1; i < s.length(); ++i)
    {
        // 如果当前字符与前一个字符相同,计数器加1
        if(s[i] == prev_char)
        {
            count++;
        }
        else
        {
            // 如果计数器大于1,说明有重复字符,将计数器转换为字符串并添加到压缩字符串中
            if(count >1)
            {
                compressed += to_string(count);
            }
            // 将前一个字符添加到压缩字符串中
            compressed += s[i-1];
            // 更新前一个字符为当前字符,并重置计数器
            prev_char = s[i];
            count =1;
        }
    }
    // 处理字符串的最后一个字符
    if(count >1)
    {
        compressed += to_string(count);
    }
    // 将最后一个字符添加到压缩字符串中
    compressed += s[s.length()-1];
    
    // 构造最终压缩字符串
    string final_compressed = "";
    int i =0;
    // 遍历原始字符串
    while(i < s.length())
    {
        char current = s[i]; // 当前字符
        int j = i;
        // 计算当前字符重复的次数
        while(j < s.length() && s[j] == current) j++;
        int cnt = j -i; // 当前字符的计数
        final_compressed += current; // 将当前字符添加到最终压缩字符串中
        // 如果计数大于1,将计数添加到最终压缩字符串中
        if(cnt >1)
        {
            final_compressed += to_string(cnt);
        }
        i = j; // 更新索引到下一个不同的字符
    }
    
    // 如果最终压缩字符串的长度小于原始字符串的长度,返回压缩字符串
    if(final_compressed.length() < s.length())
    {
        return final_compressed;
    }
    else
    {
        // 否则返回"NO",表示压缩没有效果
        return "NO";
    }
}

int main()
{
    string s;
    // 从标准输入读取字符串
    cin >> s;
    // 输出压缩后的字符串
    cout << compress_string(s);
    
    return 0;
}
  • Java
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str=scan.next();
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<str.length();i++){
          int count=0;
          int j=i;
          for(;j<str.length();j++){
            if(str.charAt(i)==str.charAt(j)){
              count++;
            }
            else{
              break;
            }
          }
          if(count>1){
            sb.append(str.charAt(i));
            sb.append(count);
            i=j-1;
          }
          else{
            sb.append(str.charAt(i));
          }
        }
        if(sb.length()<str.length()){
          System.out.print(sb.toString());
        }
        else{
          System.out.print("NO");
        }
        
        scan.close();
    }
}

10.10 求路程

1. 题目

求路程

在这里插入图片描述

2. 解题思路

s = t * v

3. 代码实现(AC_Code)

  • C++
#include <iostream>

using namespace std;

int main()
{
    int t,v;
    cin >> t >> v;

    cout << t * v << endl;

    return 0;
}
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int t = scan.nextInt();
        int v = scan.nextInt();

        System.out.println(t * v);

        scan.close();
    }
}

10.11 补 0 输出

1. 题目

补 0 输出

在这里插入图片描述

2. 解题思路

第一步:将输入的数字转换为字符串。
第二步:利用for循环往前面补0。
第三步:完整输出。

3. 代码实现(AC_Code)

  • C++
#include <iostream>
#include <string>

using namespace std;

int main()
{
    int n;
    cin >> n;

    string s = to_string(n);

    for(int i = 0; i < 8 - s.length(); i++)
        cout << '0';;
    cout << s << endl;

    return 0;
}
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();

        String s = Integer.toString(n);

        for(int i = 0; i < 8 - s.length(); i++)
            System.out.print('0');
        System.out.println(s);

        scan.close();
    }
}

10.12 IP 补充

1. 题目

IP 补充

在这里插入图片描述

2. 解题思路

知识补充:IP地址的每一部分都是一个8位的二进制数(也称为一个“字节”),每个字节可以存储的最大值是255,它的数值范围是从0到255。
原因:因为二进制的8位可以表示的最大十进制数是255(即 11111111 转换为十进制就是 255)。

3. 代码实现(AC_Code)

  • C++
#include <iostream>

using namespace std;

int main()
{
    cout << "255" << endl;

    return 0;
}
  • Java
public class Main {
    public static void main(String[] args) {
       System.out.println("255");
    }
}

10.13 出现最多的字符

1. 题目

出现最多的字符

在这里插入图片描述

2. 解题思路

第一步:定义一个21*21的二维数组存储矩阵字符。
第二步:遍历矩阵,遇到对应字符,则此字符+1。
第三步:将最后的a,b,c,d,e,f从小到大排序,输出出现次数最多的字符。

3. 代码实现(AC_Code)

  • C++
#include <iostream>
#include <string>
#include <algorithm>   // 包含冒泡排序(从小到大)的头文件

using namespace std;

int main()
{
    // 考虑‘\0’
    char Array[21][21] =
    {
        "FFEEFEAAECFFBDBFBCDA",
        "DACDEEDCCFFAFADEFBBA",
        "FDCDDCDBFEFCEDDBFDBE",
        "EFCAAEECEECDCDECADDC",
        "DFAEACECFEADCBFECADF",
        "DFBAAADCFAFFCEADFDDA",
        "EAFAFFDEFECEDEEEDFBD",
        "BFDDFFBCFACECEDCAFAF",
        "EFAFCDBDCCBCCEADADAE",
        "BAFBACACBFCBABFDAFBE",
        "FCFDCFBCEDCEAFBCDBDD",
        "BDEFCAAAACCFFCBBAAEE",
        "CFEFCFDEEDCACDACECFF",
        "BAAAFACDBFFAEFFCCCDB",
        "FADDDBEBCBEEDDECFAFF",
        "CDEAFBCBBCBAEDFDBEBB",
        "BBABBFDECBCEFAABCBCF",
        "FBDBACCFFABEAEBEACBB",
        "DCBCCFADDCACFDEDECCC",
        "BFAFCBFECAACAFBCFBAF",
    };
    int A = 0,B = 0,C = 0,D = 0,E = 0,F = 0;

    for(int i = 0; i < 20; i++)
    {
        for(int j = 0; j < 20; j++)
        {
            if(Array[i][j] == 'A')
                A++;
            if(Array[i][j] == 'B')
                B++;
            if(Array[i][j] == 'C')
                C++;
            if(Array[i][j] == 'D')
                D++;
            if(Array[i][j] == 'E')
                E++;
            if(Array[i][j] == 'F')
                F++;
        }
    }

    int newArray[6] = { A , B , C , D , E , F };
    sort(newArray,newArray + 6);

    cout << newArray[5] << endl;

    return 0;
}
  • Java
public class Main {
    public static void main(String[] args) {
        // 将矩阵转为字符串形式
        String s =
            "FFEEFEAAECFFBDBFBCDA\n"+
            "DACDEEDCCFFAFADEFBBA\n"+
            "FDCDDCDBFEFCEDDBFDBE\n"+
            "EFCAAEECEECDCDECADDC\n"+
            "DFAEACECFEADCBFECADF\n"+
            "DFBAAADCFAFFCEADFDDA\n"+
            "EAFAFFDEFECEDEEEDFBD\n"+
            "BFDDFFBCFACECEDCAFAF\n"+
            "EFAFCDBDCCBCCEADADAE\n"+
            "BAFBACACBFCBABFDAFBE\n"+
            "FCFDCFBCEDCEAFBCDBDD\n"+
            "BDEFCAAAACCFFCBBAAEE\n"+
            "CFEFCFDEEDCACDACECFF\n"+
            "BAAAFACDBFFAEFFCCCDB\n"+
            "FADDDBEBCBEEDDECFAFF\n"+
            "CDEAFBCBBCBAEDFDBEBB\n"+
            "BBABBFDECBCEFAABCBCF\n"+
            "FBDBACCFFABEAEBEACBB\n"+
            "DCBCCFADDCACFDEDECCC\n"+
            "BFAFCBFECAACAFBCFBAF";

        int[] cout = new int[6];

        for(int i = 0; i < s.length(); i++) {
            // 利用charAt:用下标获取单个字符
            if(s.charAt(i) == 'A')
                cout[0]++;
            if(s.charAt(i) == 'B')
                cout[1]++;
            if(s.charAt(i) == 'C')
                cout[2]++;
            if(s.charAt(i) == 'D')
                cout[3]++;
            if(s.charAt(i) == 'E')
                cout[4]++;
            if(s.charAt(i) == 'F')
                cout[5]++;
        }

        // 找出出现次数最大的字符
        int max = 0;
        for(int i = 0; i < 6; i++) {
            if(cout[i] > max)
                max = cout[i];
        }

        System.out.println(max);
    }
}

最后,感谢您的阅读,期待您的一键三连!
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值