`

算法题(2)

 
阅读更多

 

参考:十道算法题[二]

 

public class Test1 {

    /**
     * 删除下标为k的元素
     */
    public static int[] deleteK(int[] arr,int k) throws Exception {

        if(arr==null){
            throw new Exception("数组不能为空");
        }
        if(k>arr.length){
            throw new Exception("k不能大于数组长度");
        }

        for (int i = k; i < arr.length-1; i++) {
            arr[i] = arr[i+1];
        }

        int[] dest = new int[arr.length-1];
        System.arraycopy(arr,0,dest,0,arr.length-1);
        return dest;
    }

    /**
     * 找出常用的数字:
     * 给你一个长度为n的数组,其中有一个数字出现的次数至少为n/2,找出这个数字
     */
    public static void findMajorityElement2(int[] arrays) {

        // 装载栈的元素
        int candidate = -1;

        // 栈的大小(长度)
        int count = 0;


        // 遍历给出的数组
        for (int i = 0; i < arrays.length; i++) {


            // 判断该栈为空,那么直接将元素入栈
            if (count == 0) {

                candidate = arrays[i];
                count++;

            } else if (candidate == arrays[i]) { // 该元素是否与栈的元素一致-->入栈(栈多一个元素)
                count++;
            } else {
                // 只要不一致-->出栈(栈少一个元素)
                count--;

            }
        }

        // 只要该数字出现次数大于数组长度的2/1,那么留下来的数字肯定在栈顶中
        System.out.println("找出常用的数字:" + candidate);

    }

    /**
     * 利用等差公式找到缺失的数字
     *
     * @param arrays
     */
    public static void missingNumber2(int[] arrays) {

        // 套用等差求和公式
        int sum = (arrays[0] + arrays[arrays.length - 1]) * (arrays.length + 1) / 2;


        // 遍历数组,得出的sum减去数组每一位元素,最后即是缺失的数字

        for (int value : arrays) {
            sum -= value;
        }


        System.out.println("找到缺失的数字:" + sum);


    }

    /**
     * 移动元素0到数组最后
     *
     * @param arrays
     */
    public static void moveZero(int[] arrays) {


        // 在j前面的元素都不是0
        int j = 0;


        for (int i = 0; i < arrays.length; i++) {

            if (arrays[i] != 0) {

                // 跟j进行交换,保证j的前面都不是0
                int temp = arrays[i];
                arrays[i] = arrays[j];
                arrays[j]  = temp;

                j++;
            }
        }

        // 直至i遍历完毕后,j前面都不是0,j-i都是0(这就完成我们的任务了)
        System.out.println("移动元素0到数组最后" + Arrays.toString(arrays));
    }

    /**
     * 找出数组的单个数字
     * @param nums
     * @return
     */
    public static int singleNumber(int[] nums) {

        // 第一个数和数组后面的数做^运算,留下的必然是单个数字
        int k = nums[0];
        for (int i = 1; i < nums.length; i++) {
            k ^= nums[i];
        }
        return k;
    }

    /**
     * 画星星
     */
    public static void drawStar() {

        // 我要画5行的星星
        int row = 5;


        for (int i = 1; i <= row; i++) {

            // 空格数等于最大行数 - 当前行数
            for (int j = 1; j <= row - i; j++) {
                System.out.print(" ");
            }

            // 星星数等于(当前行数*2-1)
            for (int j = 1; j <= i * 2 - 1; j++) {

                System.out.print("*");

            }

            // 每画一行就换一次行
            System.out.println();
        }
    }

    /**
     * 将罗马数字转成阿拉伯数字,实际上就是一个查表的过程
     *
     * @param roman
     * @return
     */
    public static int digitsToValues(char roman) {

        // 定义罗马数字
        char digits[] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};

        // 罗马数字对应的阿拉伯数字
        int values[] = {1, 5, 10, 50, 100, 500, 1000};


        for (int i = 0; i < digits.length; i++) {

            if (digits[i] == roman) {
                return values[i];
            }
        }
        return 0;
    }

    /**
     * 将罗马数字转成阿拉伯数字
     *
     * @param r

     */
    public static int romanToNumber(String r) {
        int sum = 0;
        char[] arr = r.toCharArray();
        for (char c : arr) {
            sum += digitsToValues(c);
        }
        return sum;
    }

    /**
     * 啤酒与饮料题目,乘10去掉小数
     */
    public static void beerAndDrink() {

        int i,j;
        for (i = 0; i < 823/23; i++) {
            for (j = 0; j < 823/19; j++) {
                if(23*i+19*j==823&&i<j){
                    System.out.println("啤酒:"+i+"饮料:"+j);
                }

            }

        }
    }

    /**
     * 获取26字母的大小写数组
     * @return
     */
    public static char[] getArr(){
        StringBuffer sb = new StringBuffer();
        for (int i = 1; i <= 26; i++) {//获取大写的26个字母
            sb.append((char)(64+i));
        }
        String low = sb.toString().toLowerCase();//转小写
        sb.append(low);
        char[] arr = sb.toString().toCharArray();//数组输出
        return arr;
    }

    /**
     * 获取map,key是原数组,value是左移k位的数组
     * @param k
     * @return
     */
    public static Map getMap( int k){
        char[] arr = getArr();
        char[] dest = new char[arr.length];
        System.arraycopy(arr,0,dest,k,arr.length-k);
        System.arraycopy(arr,arr.length-k,dest,0,k);
        Map map = new HashMap();
        for (int i = 0; i < arr.length; i++) {
            map.put(arr[i],dest[i]);
        }
        return map;
    }

    /**
     * 根据value获取key,无返回value
     * @param m
     * @param v
     * @return
     */
    public static Object getKey(Map m,Object v){
        Object key = null;
        for (Object o : m.keySet()) {
            if(v.equals(m.get(o))){
                key = o;
            }
        }
        if(key==null){
            return v;
        }
        return key;
    }

    /**
     * 加密
     * @param str
     * @param k
     * @return
     */
    public static String Encryption(String str, int k) {

        Map map = getMap(k);

        char[] c = str.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if(map.containsKey(c[i])){
                c[i] = (char) map.get(c[i]);
            }
        }
        return String.copyValueOf(c);
    }

    /**
     * 解密
     * @param str
     * @param k
     * @return
     */
    public static String Decrypt(String str, int k) {

        Map map = getMap(k);

        char[] c = str.toCharArray();
        for (int i = 0; i < c.length; i++) {
            c[i]=(char)getKey(map,c[i]);
        }
        return String.copyValueOf(c);
    }

    /**
     * 求最大公约数
     *
     * @param num1
     * @param num2
     */
    public static int gcd(int num1, int num2) {


        // 求余数
        int r = num1 % num2;

        // 如果余数为0,那么除数就是最大公约数
        if (r == 0) {
            return num2;
        } else {

            // 否则,则用除数和余数来进行运算
            return gcd(num2, r);
        }

    }


    public static void main(String[] args) throws Exception {
        int[] arr = {1,2,5,4,6,8};
        System.out.println("删除下标为k的元素:"+ Arrays.toString(deleteK(arr,3)));
        int[] arr1 = {1,2,3,3,3};
        findMajorityElement2(arr1);
        int[] arr2 = {0,1,3,4,5};
        missingNumber2(arr2);
        moveZero(arr2);
        int[] arr3 = {1,2,1,2,3};
        System.out.println("找出数组的单个数字:"+singleNumber(arr3));

        System.out.println("画三角形星星----");
        drawStar();
        System.out.println("将罗马数字转成阿拉伯数字:"+romanToNumber("XVIII"));
        beerAndDrink();
        String e = Encryption("hello world!",2);
        String d = Decrypt(e,2);
        System.out.println("加密后:"+e);
        System.out.println("解密后:"+d);
        System.out.println("最大公约数:"+gcd(5,20));
    }
}

 

分享到:
评论

相关推荐

    Java算法集题大全.zip

    Java算法集题大全Java算法集题大全Java算法集题大全Java算法集题大全Java算法集题大全Java算法集题大全Java算法集题大全Java算法集题大全Java算法集题大全Java算法集题大全Java算法集题大全Java算法集题大全Java算法...

    LetCode简单算法题 入门算法题

    算法 ,简单 入门 LeetCode网站开放的简单算法题,用于平时检验自己的算法能力,程序设计.

    java的算法题(一)

    共有7个 很不错的java算法题 共有7个 很不错的java算法题 共有7个 很不错的java算法题 共有7个 很不错的java算法题 共有7个 很不错的java算法题 共有7个 很不错的java算法题

    算法题 算法题

    算法题算法题算法题算法题

    ACM算法题100题-经典算法库

    根据给定文件的信息,我们可以提炼出与ACM算法题及经典算法库相关的多个知识点。以下是对这些知识点的详细解析: ### ACM国际大学生软件大赛简介 ACM(Association for Computing Machinery)国际大学生软件大赛是...

    经典算法题大全

    【标题】"经典算法题大全"揭示了这个压缩包的核心内容——它是一个包含大量算法问题的集合,专门针对像蓝桥杯这样的编程竞赛。蓝桥杯是中国一项知名的计算机编程比赛,旨在提升参赛者的算法设计与实现能力。这些题目...

    华为OD真机算法题(含答案)

    华为OD真机算法题(含答案) 知识点一、货币兑换问题 在华为OD真机算法题中,出现了货币兑换问题,即如何根据给定的汇率实现货币的最大兑换和最小兑换。这种问题可以用到 Graph Theory 中的最短路径算法来解决。 ...

    java笔试常见的算法题

    全排序、二分查找、冒泡排序、阶乘、最大公约数、最小公倍数、...这是里面包含的算法,本人在准备笔试的时候找的,算法尽量采用最优的。 所有的代码均经过测试,个人觉得没有问题,如果哪位大牛找到错误,欢迎批评指正

    C语言算法题合集.zip

    C语言算法题合集.zipC语言算法题合集.zipC语言算法题合集.zipC语言算法题合集.zipC语言算法题合集.zipC语言算法题合集.zipC语言算法题合集.zipC语言算法题合集.zipC语言算法题合集.zipC语言算法题合集.zipC语言算法...

    java经典算法90题含源码及答案.rar

    通过解决这些算法题,开发者可以锻炼逻辑思维,理解和掌握数据结构,如数组、链表、栈、队列、树、图等,以及排序、搜索、图论、动态规划等核心算法。 在JAVA经典算法40题.doc中,可能包含的题目类型有递归、分治、...

    中山大学遗传算法基本习题

    中山大学遗传算法基本习题

    java经典算法题

    Java经典算法题是程序员在开发过程中常常需要面对的挑战,它们可以帮助我们提升编程思维,优化问题解决能力,尤其是在处理复杂数据结构和高效计算时显得尤为重要。这个压缩包中包含了一份名为"JAVA经典算法40题.doc...

    java常见算法题解析大全。

    在这个“java常见算法题解析大全”中,你将找到一系列涵盖不同难度级别的算法问题,旨在帮助Java开发者提升技能,增强解决问题的能力。 首先,让我们了解一下折半查找(Binary Search)算法。这是一种在有序数组中...

    常见面试算法题

    "常见面试算法题"这一主题涵盖了编程面试的核心部分,旨在帮助求职者准备这些关键的挑战。下面将详细讨论相关知识点。 1. **算法基础**:算法是解决问题的步骤集合,面试中常见的包括排序算法(如冒泡、选择、插入...

    软件工程师经典笔试算法题

    软件工程师经典笔试算法题 软件工程师经典笔试算法题是软件工程师面试中经常出现的算法笔试题,这篇文章将从六个方面对软件工程师经典笔试算法题进行详细的讲解。 一、将一整数逆序后放入一数组中 这个算法题考察...

    程序员的算法趣题.pdf.zip

    2. **搜索算法**:如深度优先搜索(DFS)和广度优先搜索(BFS)是图论中的基础,也常常被用于解决实际问题,如路径查找、网络爬虫等。二分查找是处理有序数据的有效方法,而哈希表则能实现快速查找。 3. **图论算法...

    面试常见算法题

    在IT行业的面试中,算法题是衡量候选人技术实力的重要标准之一。这些题目通常涉及数据结构、排序、查找、图论等多个领域,旨在测试应聘者的逻辑思维能力、问题解决能力和编程技巧。以下是一些常见的面试算法题及其...

    智能优化算法及程序、试题

    智能优化算法是现代计算技术中的一个重要分支,它模拟自然界中生物进化、群体行为或物理过程,来解决复杂问题的优化问题。这些算法广泛应用于工程设计、机器学习、数据分析等领域,因其能够处理非线性、多目标和高...

    C++面试题笔试题C++ 数据结构算法笔试题资料合集.zip

    C++面试题笔试题C++ 数据结构算法笔试题资料合集: 50个C、C++面试题.pdf C++ 数据结构、算法笔试题.docx C++基础面试题.docx C++开发工程师面试题库.docx C++技能测试试卷一及答案.docx C++技能测试试卷二及答案....

    程序员面试经典算法题

    《程序员面试经典算法题》是针对程序员在面试过程中可能会遇到的算法问题进行深入解析的一份资源。这份资料旨在帮助程序员提升算法思维,从而在技术面试中脱颖而出。通过学习和掌握这些经典算法,不仅可以提高编程...

Global site tag (gtag.js) - Google Analytics