文章目录
前言
本文主要介绍三道算法题,案例经供参考
题目一
原题内容
小明有一个花园,花园里面一共有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)
以上代码实现了根据给定的字符串计算最少按键次数的功能。
总结
以上就是今天的内容~
欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。
最后:转载请注明出处!!!