1、
【问题描述】
从键盘输入10个整数,存放在一个数组中,然后使数组中的所有整数整体向后移动m个位置,最后m个数变成最前面的m个数,并输出移动后的结果。m从键盘输入。
【输入形式】
输入10个整数,每个整数间用空格分隔,回车。然后输入整数m。
【输出形式】
首先输出数组中的10个元素,然后输出后移m位以后的数组所有元素。
【输入输出样例】
Please input 10 numbers:
1 2 3 4 5 6 7 8 9 10
Your numbers are:
1 2 3 4 5 6 7 8 9 10
Please input m:
3
The new numbers are:
8 9 10 1 2 3 4 5 6 7
package learn;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.println("Please input 10 numbers:");
Scanner in=new Scanner(System.in);
int[] arr=new int[10];
int m;
for(int i=0;i<10;i++){
arr[i]=in.nextInt();
}
System.out.println("Your numbers are:");
print(arr);
System.out.println("Please input m:");
m= in.nextInt();
int[] res=new int[10];
for(int i=0;i<arr.length;i++){
res[(i+m)%10]=arr[i];
}
System.out.println("The new numbers are:");
print(res);
}
public static void print(int[] arr) {
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
2、回文问题
【问题描述】所谓“回文数”是指具有如下性质的整数:一个整数,当它的各位数字逆序排列,形成的整数与原整数相同,这样的数称为回文数。例如,素数11,373,其各位数字对换位置后仍然为11,373,因此这两个整数均为回文数。编写程序,接收控制台输入的两个整数a、b,输出a到b之间(包括a和b)的所有回文数
【输入形式】控制台输入两个整数a和b(必有a<b),以空格分隔。
【输出形式】输出有若干行,每行有一个a和b之间的回文数。输出各行上的数字不重复,且从小至大依次按序输出。
【样例输入】3 120
【样例输出】
3
4
5
6
7
8
9
11
22
33
44
55
66
77
88
99
101
111
【样例说明】输入整数a=3,b=120,要求输出所有[3, 120]之间的回文数。按升序分行输出所有符合题意的整数。
package learn;
import java.util.Scanner;
import java.util.Stack;
public class Test {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int a= in.nextInt();
int b= in.nextInt();
for(int i=a;i<=b;i++){
if(isPalindrome(i)){
System.out.println(i);
}
}
}
public static boolean isPalindrome(int x) {
String s=String.valueOf(x);
char[] c=s.toCharArray();
Stack<Character> stack=new Stack<>();
int lastIndex=c.length-1;
for(int i=lastIndex/2+1;i<=lastIndex;i++){
stack.push(c[i]);
}
int now=0;
while (!stack.isEmpty()){
if(c[now]!=stack.pop()){
return false;
}
now++;
}
return true;
}
}
3、贪心策略:
问题描述】输入一个高精度的大正整数S(S最长可达240位),去掉其中任意N位数字后剩下的数字按原次序组成一个新的正整数S’。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数S’最小。
【输入形式】输入有两行:
1.第一行是大整数S。其中S最长可达240位。
2.第二行是整数N。S、N均以非0数字开头。
【输出形式】输出有一行,是在S中删除N位后所得的最小数字S’。
【样例输入1】
178543
4
【样例输出1】13
【样例输入2】
1002
1
【样例输出2】002
【样例说明】样例1中输入整数S=178543,N=4,要求在178543中删除4位,使剩下的数字最小。正确答案为S’= 13。样例2中输入整数S=1002,N=1,删完一位后S’= 002,而不是2,即2之前的0也必须输出。
【运行时限】程序一次运行的最长时间限制在15秒内,超出则认为程序错误。
思路:
每轮删数,都从前往后找第一个降序的,删除。若全升序,删除最后一个数
package learn;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String s=in.next();
int x=in.nextInt();
char[] c=s.toCharArray();
List<Integer> list=new ArrayList<>();
for(int i=0;i<c.length;i++){
list.add(c[i]-'0');
}
for(int i=0;i<x;i++){//执行i次删除
int j=0;
while (j<list.size() && (j+1)<list.size() && list.get(j)<=list.get(j+1)){
j++;
}//j==list.size()-1 或 list.get(j)>list.get(j+1) 时退出
list.remove(j);
}
for (int i=0;i<list.size();i++){
System.out.print(list.get(i));
}
}
}
从左至右第一个逆序的说明此数是从左边第一个数起到此数后一个数中的最大数,删除任意一个数,原数的位数都减一。递增的一段序列中任意删除一个数,剩余位数都相等(1234->123/124/134/234),明显删最后一位最大的最佳。(13254->1254/1324),有递减序列时,明显删前面的大数优于删后面的,一样位数,得到的高位更小。