一、
Redraiment是走梅花桩的高手。Redraiment总是起点不限,从前到后,往高的桩子走,但走的步数最多。
你能替Redraiment研究他最多走的步数吗?
输入描述:
输入多行,先输入数组的个数,再输入相应个数的整数
输出描述:
输出结果
样例输入
6
2 5 1 5 4 5
样例输出
3
提示
Example:
6个点的高度各为 2 5 1 5 4 5
如从第1格开始走,最多为3步, 2 4 5
从第2格开始走,最多只有1步,5
而从第3格开始走最多有3步,1 4 5
从第5格开始走最多有2步,4 5
所以这个结果是3。
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//最大非连续上升子序列问题
while(sc.hasNext()) {
int n = sc.nextInt();
int a[] = new int [n];
for(int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
int[] dp = new int[n];
for(int i = 0; i < n; i++) {
dp[i] = 1;
for(int j = 0; j < i; j++) {
if(a[j] < a[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
//dp[n-1]并不一定是最大的情况
int res = 0;
for(int i = 0; i < n; i++) {
res = Math.max(res, dp[i]);
}
System.out.println(res);
}
sc.close();
}
}
二、
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出。
如果有其他字符,则对这些字符不用进行统计
清空目前的统计结果,重新统计
输入描述:
输入一串字符。
输出描述:
对字符中的
各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
示例1
输入
aadddccddc
输出
dca
class ch {
int cnt;
char c;
public ch(int cnt, char c) {
this.cnt = cnt;
this.c = c;
}
}
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//直接TreeSet排序
while(sc.hasNext()) {
String str = sc.nextLine();
Set<ch> set = new TreeSet<ch>(new Comparator<ch>(){
@Override
public int compare(ch o1, ch o2) {
if(o1.cnt < o2.cnt) {
return 1;
}else if(o1.cnt == o2.cnt) {
return o1.c - o2.c;
}else {
return -1;
}
}
});
int len = str.length();
int bucket[] = new int[128];
for(int i = 0; i < len; i++) {
int tmp = str.charAt(i);
bucket[tmp]++;
}
for(int i = 0; i < 128; i++) {
if(bucket[i] != 0) {
set.add(new ch(bucket[i], (char)i));
}
}
for(ch c : set) {
System.out.print(c.c);
}System.out.println();
}
sc.close();
}
}
三、
题目描述
输入整型数组和排序标识,对其元素按照升序或降序进行排序
输入描述:
1、输入需要输入的整型数个数
2、输入排序标识,0表示按升序,1表示按降序
输出描述:
输出排好序的数字
示例1
输入
8
1 2 4 9 3 55 64 25
0
输出
1 2 3 4 9 25 55 64
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//直接冒泡排序
while(sc.hasNext()) {
int n = sc.nextInt();
int[] a = new int[n];
for(int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
int flag = sc.nextInt();
if(flag == 0) {
for(int i = n - 1; i > 0; i--) {
for(int j = 0; j < i; j++) {
if(a[j] > a[j + 1]) {
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
}else if(flag == 1) {
for(int i = n - 1; i > 0; i--) {
for(int j = 0; j < i; j++) {
if(a[j] < a[j + 1]) {
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
}
for(int i = 0; i < n - 1; i++) {
System.out.print(a[i]+" ");
}System.out.println(a[n - 1]);
}
sc.close();
}
}
四、
自守数是指一个数的平方的尾数等于该数自身的自然数。
例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。
请求出n以内的自守数的个数
输入描述:
int型整数
输出描述:
n以内自守数的数量。
示例1
输入
2000
输出
8
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//可以用indexOf
while(sc.hasNext()) {
int n = sc.nextInt();
int cnt = 0;
for(int i = 0; i <= n; i++) {
String tmp = String.valueOf(i * i);
String tmpi = String.valueOf(i);
if(tmp.lastIndexOf(tmpi) == tmp.length() - tmpi.length()) {
cnt++;
}
}
System.out.println(cnt);
}
sc.close();
}
}
五、
将一个字符中所有出现的数字前后加上符号“*”,其他字符保持不变
输入描述:
输入一个字符串
输出描述:
字符中所有出现的数字前后加上符号“*”,其他字符保持不变
输入
Jkdi234klowe90a3
输出
Jkdi*234*klowe*90*a*3*
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//先给每个数字前后加上*,连续的数字间会有两个*,去掉即可
while(sc.hasNext()) {
String str = sc.nextLine();
StringBuffer sb = new StringBuffer();
int len = str.length();
for(int i = 0; i < len; i++) {
char c= str.charAt(i);
if(c - '0' >= 0 && c - '0' <= 9) {
sb.append("*"+c+"*");
}else {
sb.append(c);
}
}
System.out.println(sb.toString().replace("**", ""));
}
sc.close();
}
}