算法题分析(一)

文章目录

题目一

原题内容

代码实现

题目二

原题内容

代码实现

题目三

原题内容

代码实现

总结


前言

本文主要介绍三道算法题,案例经供参考

题目一

原题内容

小明有一个花园,花园里面一共有m朵花,对于每一朵花,都是不一样的,小明用1~m中的一个整数表示每一朵花。

他很喜欢去看这些花,有一天他看了n次,并将n次他看花的种类是什么按照时间顺序记录下来。

记录用a[i]表示,表示第i次他看了a[i]这朵花。

小红很好奇,她有Q个问题,问[l,r]的时间内,小明一共看了多少朵不同的花儿,小明因为在忙着欣赏他的花儿,所以想请你帮他回答这些问题。

输入描述

输入两个数n,m;(1<=n<=2000,1<=m<=100);分别表示n次看花,m表示一共有m朵花儿。

接下来输入n个数a[1]~a[n],a[i]表示第i次,小明看的花的种类;

输入一个数Q(1<=Q<=1000000);表示小红的问题数量。

输入Q行 每行两个数 l,r(1<=l<=r<=n); 表示小红想知道在第l次到第r次,小明一共看了多少不同的花儿。

输出描述

一共Q行

每一行输出一个数 表示小明在[l,r]的时间内看了多少种花。

代码实现


import java.util.*;

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

        int[] flowers = new int[n];
        for (int i = 0; i < n; i++) {
            flowers[i] = scanner.nextInt();
        }

        int q = scanner.nextInt();
        for (int i = 0; i < q; i++) {
            int l = scanner.nextInt();
            int r = scanner.nextInt();

            Set<Integer> set = new HashSet<>();
            for (int j = l - 1; j < r; j++) {
                set.add(flowers[j]);
            }

            System.out.println(set.size());
        }
    }
}

上述代码的思路是,首先读取输入的n和m,然后创建一个大小为n的数组来存储小明看花的种类。接下来,读取n个数并将其存入数组中。

然后,读取输入的Q,表示小红的问题数量。对于每个问题,读取输入的l和r,并创建一个集合来存储在第l次到第r次之间小明看过的花的种类。遍历数组中从第l-1个元素到第r个元素,将每个元素加入集合中。

最后,输出集合的大小,即小明在[l,r]的时间内看了多少种花。

题目二

原题内容

对于给定的一个二维矩阵,请转置后进行输出。

输入描述

对于一个n*m的矩阵,输入有n行,每行是m个以空格分隔的数字。

输出描述

n*m矩阵的转置矩阵。输出m行,每行是n个空格分隔的数据。

示例

输   入:

1 2 3 4 5 6

返回值:

1 4 2 5 3 6

代码实现

C语言实现:

#include <stdio.h>

void transpose(int matrix[][100], int n, int m) {
    int transposed[m][n];
    
    // 转置矩阵
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            transposed[i][j] = matrix[j][i];
        }
    }
    
    // 输出转置矩阵
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", transposed[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int n, m;
    int matrix[100][100];
    
    // 输入矩阵
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
    
    // 转置并输出矩阵
    transpose(matrix, n, m);
    
    return 0;
}

Java语言实现:

import java.util.Scanner;

public class Main {
    public static void transpose(int[][] matrix, int n, int m) {
        int[][] transposed = new int[m][n];
        
        // 转置矩阵
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                transposed[i][j] = matrix[j][i];
            }
        }
        
        // 输出转置矩阵
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(transposed[i][j] + " ");
            }
            System.out.println();
        }
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[][] matrix = new int[n][m];
        
        // 输入矩阵
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                matrix[i][j] = scanner.nextInt();
            }
        }
        
        // 转置并输出矩阵
        transpose(matrix, n, m);
    }
}

Python语言实现:

def transpose(matrix):
    n = len(matrix)
    m = len(matrix[0])
    transposed = [[0] * n for _ in range(m)]
    
    # 转置矩阵
    for i in range(m):
        for j in range(n):
            transposed[i][j] = matrix[j][i]
    
    # 输出转置矩阵
    for row in transposed:
        print(' '.join(map(str, row)))

# 输入矩阵
matrix = []
n, m = map(int, input().split())
for _ in range(n):
    row = list(map(int, input().split()))
    matrix.append(row)

# 转置并输出矩阵
transpose(matrix)

以上代码分别使用C语言、Java语言和Python语言实现了给定二维矩阵的转置操作,并输出转置后的矩阵。

题目三

原题内容

描述

小明很喜欢打字,今天小红给了小明一个字符串。

这个字符串只包含大写和小写字母。 

我们知道,按下CapsLock键,可以切换大小写模式。

我们在小写模式时候,同时按下shift+字母键,就能写出大写字母。

在大写模式的时候,按下shift+字母键,就能写出小写字母。

现在问题来了,给你一个字符串,问你最少使用多少个按键,就可以写出这个字符串呢?

注意,按shift和字母键,算两次按键。开始时均为小写状态。

输入描述

第一行一个T,表示有T组输入。

接下来T组数据:

每组数据一个字符串s,s的长度小于等于100。仅包含大小写字母。

输出描述

对于每组数据,输出最少按键次数。

示例

输   入:

3 A AA AAAAAA

返回值:

2 3 7

代码实现

Java实现:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        scanner.nextLine(); // 读取换行符

        for (int i = 0; i < T; i++) {
            String s = scanner.nextLine();
            int count = getMinimumKeyPresses(s);
            System.out.println(count);
        }
    }

    private static int getMinimumKeyPresses(String s) {
        int count = 0;
        boolean capsLockOn = false;

        for (char c : s.toCharArray()) {
            if (Character.isUpperCase(c) != capsLockOn) {
                count += 2;
                capsLockOn = !capsLockOn;
            }
            count++;
        }

        return count;
    }
}

C语言实现:

#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>

int getMinimumKeyPresses(char* s) {
    int count = 0;
    bool capsLockOn = false;

    for (int i = 0; s[i] != '\0'; i++) {
        if (isupper(s[i]) != capsLockOn) {
            count += 2;
            capsLockOn = !capsLockOn;
        }
        count++;
    }

    return count;
}

int main() {
    int T;
    scanf("%d", &T);
    getchar(); // 读取换行符

    for (int i = 0; i < T; i++) {
        char s[101];
        fgets(s, sizeof(s), stdin);
        int count = getMinimumKeyPresses(s);
        printf("%d\n", count);
    }

    return 0;
}

Python实现:

def get_minimum_key_presses(s):
    count = 0
    caps_lock_on = False

    for c in s:
        if c.isupper() != caps_lock_on:
            count += 2
            caps_lock_on = not caps_lock_on
        count += 1

    return count

T = int(input())

for _ in range(T):
    s = input()
    count = get_minimum_key_presses(s)
    print(count)

以上代码实现了根据给定的字符串计算最少按键次数的功能。

总结

以上就是今天的内容~

欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

最后:转载请注明出处!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小鱼༒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值