贪心算法删数问题(第3题) java作业

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),有递减序列时,明显删前面的大数优于删后面的,一样位数,得到的高位更小。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述据元素之间的逻辑关系,如线性结构(如组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象据类型。 存储结构(物理结构):描述据在计算机中如何具体存储。例如,组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法算法设计:研究如何将解决问的步骤形式化为一系列指令,使得计算机可以执行以求解问算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过学方法分析算法的时间复杂度(运行时间随据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值