人生无趣,生活不易,一起找点乐子吧。
数列特征:
问题描述
给出n个数,找出这n个数的最大值,最小值,和。
输入格式
第一行为整数n,表示数的个数。
第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。
输出格式
输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。
样例输入
5
1 3 -2 4 5
样例输出
5
-2
11
数据规模与约定
1 <= n <= 10000。
思维还一直处在python里,直接就max(),min()了。查了下,有max函数的是collection,不会用,有会的,评论写下面吧。
import java.util.*;
public class Main {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int arr[] = new int[n];
for(int i = 0;i<n;i++){
arr[i] = sc.nextInt();
}
sc.close();
int max = arr[0];
int min = arr[0];
int sum = 0;
for(int i = 0;i<arr.length;i++){
if(arr[i]>max){
max = arr[i];
}
if(arr[i]<min){
min = arr[i];
}
sum += arr[i];
}
System.out.println(max);
System.out.println(min);
System.out.println(sum);
}
}
循环遍历了一遍,找最大最小值,顺便求了累加,用于求平均。
查找整数:
问题描述
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
输入格式
第一行包含一个整数n。
第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。
第三行包含一个整数a,为待查找的数。
输出格式
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
样例输入
6
1 9 4 8 3 9
9
样例输出
2
数据规模与约定
1 <= n <= 1000。
这个貌似也没有说的点,交给python的话直接list.find(int)就好了,java只会用数组,如果大家有其他的简单数据结构,下面评论。循环遍历查找,返回下标,循环完未找到,立个flag做个标记就好。
import java.util.*;
public class Main {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int arr[] = new int[n];
for(int i = 0;i<n;i++){
arr[i] = sc.nextInt();
}
int a = sc.nextInt();
sc.close();
int state = 0;
for(int i = 0;i<arr.length;i++){
if(arr[i] == a){
System.out.println(i+1);
state = 1;
break;
}
}
if(state == 0){
System.out.println(-1);
}
}
}
杨辉三角:
问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行。
输入格式
输入包含一个数n。
输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
数据规模与约定
1 <= n <= 34。
数据规模在34以下,做个34*34的数组存储就好了,前两行的数据手动写出,剩下的由计算给出,数组生成后,循环遍历输出每行即可。
import java.util.*;
public class Main {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
int list[][] = new int[34][34];
list[0][0] = 1;
list[1][0] = 1;
list[1][1] = 1;
for (int i = 3;i<=34;i++){
list[i-1][0] = 1;
for(int j = 1;j<=i-2;j++){
list[i-1][j] = list[i-2][j] + list[i-2][j-1];
}
list[i-1][i-1] = 1;
}
for(int i = 0;i<n;i++){
for(int j = 0;j<=i;j++){
System.out.printf(list[i][j] + " ");
}
System.out.println();
}
}
}
没什么难的东西,就是麻烦,计算的时候别把下标算错就好。
特殊的数字:
问题描述
153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。
输出格式
按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。
题目很简单,数据范围为三位十进制数,也就是说从100到999.需要做的就是判断数字的每位数字的立方和是不是等于原数值而已,代码的核心点是怎样把数字的每一位一个个取出来。记住一个蠢方法,如果除法解决不了,就用取余。比如取出百位数字:num/100,取出个位数字num%10,十位数字就别想了,等于num – 百位数字x100 – 个位数字(如果非要想的话(num/10)%10 )。完,可以了,还有一种方法,先把数字当成字符串来处理,将每个字符取出,然后再转换成数字。这种方法用python很好实现,java也并不难,可以尝试下。
示例代码:
import java.util.*;
public class Main {
public static void main(String args[]){
int a,b,c;
for(int i = 100;i<1000;i++){
a = i/100;
b = (i/10)%10;
c = i%10;
if(a*a*a+b*b*b+c*c*c == i){
System.out.println(i);
}
}
}
}
回文数:
问题描述
1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
输出格式
按从小到大的顺序输出满足条件的四位十进制数。
这个问题一开始会怎样考虑,还是把数字一个个取出来吗,但是此问题我们需要做的是将数字倒过来,其实并没有什么逻辑上的计算,因此,考虑上道题我说的那个方法,把数字当成字符串,将字符串倒置,来比较倒置前后是否相同,相同就输出。
字符串的倒置有方法吗?有,需要个中介StringBuilder(),StringBuilder的reverse方法可以将参数倒置,他的toString方法可以把StringBuilder对象转回String。那就很简单了:
public class Main {
public static void main(String args[]){
String s;
for(int i = 1000;i<10000;i++){
s = ""+i;
if(new StringBuilder(s).reverse().toString().equals(s)){
System.out.println(i);
}
}
}
}
ok,写完了吧。
java笔记只写一点:
1、将字符串s倒置:new StringBuilder(s).reverse().toString()