用Java实现一些简单算法

作者: 志哥谈笑间 | 来源:发表于2016-09-19 19:01 被阅读603次

    for循环,外循环控制的是行数,内循环控制的是每一行的个数。

    *****
    *****
    *****
    *****
    
    for (int x = 0; x < 4; x++){// 外循环控制的是行数
        for (int y = 0; y < 5; y++){// 内循环控制的是每一行的个数
            System.out.print("*");
        }
        System.out.println();
    }
    

    --------------------------------------------------

    *****
    ****
    ***
    **
    *
    
    for (int x = 1; x <= 5; x++) {
        for (int y = x; y <= 5; y++) {
            System.out.print("*");
        }
        System.out.println();
    }
    

    --------------------------------------------------

    *
    **
    ***
    ****
    *****
    
    for (int x = 1; x <= 5; x++) {
        for (int y = 1; y <= x; y++) {
            System.out.print("*");
        }
        System.out.println();
    }
    

    --------------------------------------------------

    54321
    5432
    543
    54
    5

    for (int x = 1; x <= 5; x++) {
        for (int y = 5; y >= x; y--) {
            System.out.print(y);
        }
        System.out.println();
    }
    

    --------------------------------------------------

    1
    22
    333
    4444
    55555

    for (int x = 1; x <= 5; x++) {
        for (int y = 1; y <= x; y++) {
            System.out.print(x);
        }
        System.out.println();
    }
    

    --------------------------------------------------

    * * * * *
     * * * * 
      * * *
       * *
        * 
    
    for (int x = 1; x <= 5; x++) {//分成左右两边,左边是空格,右边是*加空格
        for (int y = 1; y < x; y++) {
            System.out.print(" ");
        }
        for (int z = x; z <= 5; z++) {
            System.out.print("* ");
        }
        System.out.println();
    }
    

    --------------------------------------------------

        *
       * *
      * * *
     * * * *
    * * * * *
    
    for (int x = 1; x <= 5; x++) {
        for (int y = x; y < 5; y++) {
            System.out.print(" ");
        }
        for (int z = 1; z <= x; z++) {
            System.out.print("* ");
        }
        System.out.println();
    }
    

    --------------------------------------------------

    九九乘法表

    for (int x = 1; x <= 9; x++) {
        for (int y = 1; y <= x; y++) {
            System.out.print(y + "*" + x + "=" + y * x + "\t");
        }
        System.out.println();
    }
    

    整型数组

    遍历数组的功能

    public static void printArray(int[] arr) {
        System.out.print("[");
        for (int x = 0; x < arr.length; x++) {
            if (x != arr.length - 1) {
                System.out.print(arr[x] + ",");
            } else {
                System.out.println(arr[x] + "]");
            }
        }
    }
    

    --------------------------------------------------

    获取最大值

        public static int getMax(int[] arr) {
            int maxElement = arr[0];
            for (int x = 0; x < arr.length; x++) {
                if (arr[x] > maxElement) {
                    maxElement = arr[x];
                }
            }
            return maxElement;
        }
    

    --------------------------------------------------

    获取最大值2

        public static int getMax_2(int[] arr) {
            int maxIndex = 0;
            for (int x = 0; x < arr.length; x++) {
                if (arr[x] > arr[maxIndex]) {
                    maxIndex = x;
                }
            }
            return arr[maxIndex];
        }
    

    --------------------------------------------------

    置换

        private static void swap(int[] arr, int a, int b) {
            int temp = arr[a];
            arr[a] = arr[b];
            arr[b] = temp;
        }
    

    --------------------------------------------------

    反转

        public static void reverseArray(int[] arr) {
            for (int start = 0, end = arr.length - 1; start < end; start++, end--) {
                swap(arr, start, end);
            }
        }
    

    --------------------------------------------------

    冒泡排序

    基本思路:相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处。依次类推

        public static void bubbleSort(int[] arr) {
            for (int x = 0; x < arr.length - 1; x++) {
                for (int y = 0; y < arr.length - 1 - x; y++) {
                    if (arr[y] > arr[y + 1]) {
                        swap(arr, y, y + 1);
                    }
                }
            }
        }
    

    --------------------------------------------------

    选择排序

    基本思路: 把第一个元素依次和后面的所有元素进行比较。 第一次结束后,就会有最小值出现在最面。依次类推

        public static void selectSort(int[] arr) {
            for (int x = 0; x < arr.length - 1; x++) {
                for (int y = x + 1; y < arr.length; y++) {
                    if (arr[x] > arr[y]) {
                        swap(arr, x, y);
                    }
                }
            }
        }
    

    --------------------------------------------------

    选择排序2,记录索引

        public static void selectSort_2(int[] arr) {
            for (int x = 0; x < arr.length - 1; x++) {
                int num = arr[x];
                int index = x;
                for (int y = x + 1; y < arr.length; y++) {
                    if (num > arr[y]) {
                        num = arr[y];
                        index = y;
                    }
                }
                if (index != x) {
                    swap(arr, x, index);
                }
            }
        }
    

    --------------------------------------------------

    二分查找(折半查找),数组必须有序

        public static int halfSearch(int[] arr, int key) {
            int max = arr.length - 1;
            int min = 0;
            int mid = (max + min) / 2;
            while (arr[mid] != key) {
                if (key > arr[mid]) {
                    min = mid + 1;
                } else if (key < arr[mid]) {
                    max = mid - 1;
                }
                if (max < min) {
                    return -1;
                }
                mid = (max + min) / 2;
            }
            return mid;
        }
    

    --------------------------------------------------

    二分查找2,数组必须有序

        public static int halfSearch_2(int[] arr, int key) {
            int max, min, mid;
            min = 0;
            max = arr.length - 1;
            while (min <= max) {
                mid = (min + max) >> 1;
                if (key > arr[mid]) {
                    min = mid + 1;
                } else if (key < arr[mid]) {
                    max = mid - 1;
                } else {
                    return mid;
                }
            }
            return -min - 1;
    
        }
    

    字符串

    字符串数组置换

        private static void swap(String[] arr, int a, int b) {
            String temp = arr[a];
            arr[a] = arr[b];
            arr[b] = temp;
        }
    

    给定一个字符串数组。按照字典顺序进行从小到大的排序。

        public static void sortString(String[] arr) {
            for (int i = 0; i < arr.length - 1; i++) {
                for (int j = i + 1; j < arr.length; j++) {
                    if (arr[i].compareTo(arr[j]) > 0) {
                        swap(arr, i, j);
                    }
                }
            }
        }
    

    --------------------------------------------------

    一个子串在整串中出现的次数。

    //"nbaernbatynbauinbaopnba"     “nba"
    /* 思路:
    * 1,要找的子串是否存在,如果存在获取其出现的位置。这个可以使用indexOf完成。
    * 2,如果找到了,那么就记录出现的位置并在剩余的字符串中继续查找该子串,
    * 而剩余字符串的起始位是出现位置+子串的长度.
    * 3,以此类推,通过循环完成查找,如果找不到就是-1,并对每次找到用计数器记录。
    */
    
    //方法一
        public static int getKeyStringCount(String str, String key) {
            // 定义计数器
            int count = 0;
            // 定义变量记录key出现的位置
            int index = 0;
            while ((index = str.indexOf(key)) != -1) {
                str = str.substring(index + key.length());
                count++;
            }
            return count;
        }
    //方法二
        public static int getKeyStringCount_2(String str, String key) {
            int count = 0;
            int index = 0;
            while ((index = str.indexOf(key, index)) != -1) {
                index = index + key.length();
                count++;
            }
            return count;
        }
    

    --------------------------------------------------

    两个字符串中最大相同的子串。

    /* "qwerabcdtyuiop" "xcabcdvbn"
    * 思路: 1,既然取得是最大子串,先看短的那个字符串是否在长的那个字符串中。 如果存在,短的那个字符串就是最大子串。
    * 2,如果不是呢,那么就将短的那个子串进行长度递减的方式去子串,去长串中判断是否存在。 如果存在就已找到,就不用在找了。
    */
        public static String getMaxSubstring(String s1, String s2) {
            String max = null, min = null;
            max = (s1.length() > s2.length()) ? s1 : s2;
            min = max.equals(s1) ? s2 : s1;
            System.out.println("max=" + max);
            System.out.println("min=" + min);
            for (int i = 0; i < min.length(); i++) {
                for (int a = 0, b = min.length() - i; b != min.length() + 1; a++, b++) {
                    String sub = min.substring(a, b);
                    // System.out.println(sub);
                    if (max.contains(sub))
                        return sub;
                }
            }
            return null;
        }
    

    --------------------------------------------------
    20161018 更新

    在一个字符串中,统计出现的整数的个数,连续的数字为一个整数(不考虑负数),字符串中不包含空格。

    /**
    * a10b20c30de40fg
    * 思路:首先要遍历所有的字符,判断每个字符是不是数字,是数字的话就把它放在一个StringBuilder对象
    * 里面并标记,下面一个字符要是数字就加在后面,不是数字的话,就把当前的StringBuilder里面的数字
    * 塞到list里面,最后判断list长度即可
    */
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        scanner.close();    
        if (s != null && s.length() != 0) {
            List<Integer> list = new ArrayList<Integer>();
            StringBuilder sb = new StringBuilder();
            boolean isChar = false;
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (c >= '0' && c <= '9') {
                    sb.append(s.charAt(i));
                    if (i == s.length() - 1) {
                        list.add(Integer.parseInt(sb.toString()));
                        sb.setLength(0);
                    }
                    isChar = false;
                } else {
                    if (sb.length() > 0 && isChar == false) {
                        list.add(Integer.parseInt(sb.toString()));
                        sb.setLength(0);
                    }
                    isChar = true;
                }
            }
            System.out.println(list.size());        
        }
    }
    

    如果要是换个问法也是一样的,统计一个字符串中出现整数的和,只需要在下面加入一个遍历list,把所有的数字加一起就好了。

    if (list.size() > 0) {
        int sum = 0;
        for (int i = 0; i < list.size(); i++) {
            sum = sum + list.get(i);
        }
        System.out.println(sum);
    }
    

    持续更新……

    如果觉得内容还不错,可以关注一下我哦
    微信公众号:志哥 (ID: zhige-me)
    期待与你相遇,一同成长前行!


    微信公众号:志哥 (ID: zhige-me)

    相关文章

      网友评论

      本文标题:用Java实现一些简单算法

      本文链接:https://www.haomeiwen.com/subject/kfynettx.html