zoukankan      html  css  js  c++  java
  • 简单算法3

    股票

    package com.sly.uploadfile.algorithm;
    
    /**
     * Created by fmgao on 2019/7/9.
     * 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
     * <p>
     * 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
     * <p>
     * 注意你不能在买入股票前卖出股票。
     * <p>
     * 示例 1:
     * <p>
     * 输入: [7,1,5,3,6,4]
     * 输出: 5
     * 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     * 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
     */
    public class Gupiao01 {
    
        public static int maxProfit(int[] prices) {
            if (prices == null || prices.length == 0) {
                return 0;
            }
            int[] dp = new int[prices.length];
            int minPrice = prices[0];
            for (int i = 1; i < prices.length; i++) {
                minPrice = Math.min(minPrice, prices[i]);
                dp[i] = Math.max(dp[i - 1], prices[i] - minPrice);//只需记住当前的最小值即可
            }
            return dp[prices.length - 1];
        }
    
        public static void main(String[] args) {
            int[] a = {7, 1, 5, 3, 6, 4};
            int d = maxProfit(a);
            System.out.println(d);
    
            System.out.println(getMax(a));
        }
    
        public static int getMax(int[] a) {
            if (a.length == 0 || a == null) {
                return 0;
            }
            int b[] = new int[a.length];
            int mina = a[0];
            for (int i = 1; i < a.length; i++) {
                mina = Math.min(mina, a[i]);
                b[i] = Math.max(b[i - 1], a[i] - mina);
            }
            return b[a.length - 1];
        }
    }

    括号分数

    package com.sly.uploadfile.algorithm;
    
    import java.util.Stack;
    
    /**
     * Created by fmgao on 2019/9/11.
     * 给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
     * <p>
     * () 得 1 分。
     * AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
     * (A) 得 2 * A 分,其中 A 是平衡括号字符串。
     * <p>
     * <p>
     * 示例 1:
     * <p>
     * 输入: "()"
     * 输出: 1
     */
    public class KuoHaoFenShu {
        public static void main(String[] args) {
            System.out.println(scoreOfParent("((()))"));
        }
    
        public static int scoreOfParent(String s) {
            Stack<String> stack = new Stack<>();
            for (int i = 0, len = s.length(); i < len; i++) {
                if ('(' == s.charAt(i)) {
                    stack.push("(");
                } else {
                    if ("(".equals(stack.peek())) {
                        stack.pop();
                        stack.push(1 + "");
                    } else {
                        int intTemp = Integer.parseInt(stack.pop());
                        if ("(".equals(stack.peek())) {
                            stack.pop();
                            stack.push((intTemp * 2) + "");
                        }
                    }
    //                如果栈里面的元素有多个数字的情况,那么你就需要把这几个数字进行相加,然后再压入栈
                    int add = 0;
                    while (!stack.isEmpty() && !"(".equals(stack.peek())) {
                        add += Integer.parseInt(stack.pop());
                    }
                    stack.push(add + "");
                }
            }
            return Integer.parseInt(stack.pop());
        }
    }

    字符串长度

    package com.sly.uploadfile.algorithm;
    
    /**
     * Created by fmgao on 2020/1/7.
     */
    public class LengthOfString {
    
        public static void main(String[] args) {
            String a = "i am a person";
            System.out.println(getLength(a));
            System.out.println(getLength1(a));
        }
    
        private static int getLength(String s) {
            if (s == "") {
                return 0;
            }
            if (s.trim().length() == 0) {
                return 0;
            }
            String[] a = s.split(" ");
            return a[a.length - 1].length();
        }
    
        private static int getLength1(String s) {
            int len = s.length();
            while (len > 0 && s.substring(len - 1, len).equals(" ")) {
                len--;
            }
            for (int i = len - 1; i >= 0; i--) {
                if (s.substring(i, i + 1).equals(" ")) {
                    return len - 1 - i;
                }
            }
            return len;
        }
    
    }

    重复数组移除重复数据后的长度

    package com.sly.uploadfile.algorithm;
    
    /**
     * Created by fmgao on 2019/12/9.
     * <p>
     * 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
     * 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
     * <p>
     * 示例 1:
     * 给定数组 nums = [1,1,2],
     * 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
     * 你不需要考虑数组中超出新长度后面的元素。
     */
    public class RemoveDuplicates {
    
        public static void main(String[] args) {
            int[] nums = {1, 1, 2, 2, 3, 3, 3, 4, 4};
    //        int i = removeDuplicates(nums);
    //        System.out.println(i);
            System.out.println(removeDuplicates(nums));
        }
    
    
        public static int removeDuplicates(int[] nums) {
            if (nums.length == 0) {
                return 0;
            }
            int i = 0;
            for (int j = 1; j < nums.length; j++) {
                if (nums[j] != nums[i]) {
                    i++;
                    nums[i] = nums[j];
                }
            }
            return i + 1;
        }
    
        public static int removeDuplicates2(int[] nums) {
            if (nums.length <= 1) {
                return nums.length;
            }
            int cur = 1;
            for (int j = 1; j < nums.length; j++) {
                if (nums[j] != nums[cur - 1]) {
                    nums[cur++] = nums[j];
                }
            }
            return cur;
        }
    
        public static int removeDuplicates3(int[] nums) {
            if (nums.length <= 2) {
                return nums.length;
            }
            int num = 1;
            int cur = 1;
            for (int i = 1; i < nums.length; i++) {
                if (nums[i] == nums[i - 1]) {
                    if (num == 1) {
                        nums[cur++] = nums[i];
                    }
                    num++;
                } else {
                    nums[cur++] = nums[i];
                    num = 1;
                }
            }
            return cur;
        }
    
    }

    数字resverse

    package com.sly.uploadfile.algorithm;
    
    /**
     * Created by fmgao on 2019/7/1.
     */
    public class ReverseIntNo {
    
        public static void main(String[] args) {
            int res = reverse(147483647);
            System.out.println(res);
            System.out.println(Integer.MAX_VALUE);
            System.out.println(147483647 % 10);
            System.out.println(147483647 / 10);
        }
    
        public static int reverse(int x) {
    
            long result = 0;
    
            while (x != 0) {
                result = result * 10 + x % 10;
                x /= 10;
            }
    
            if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
                result = 0;
            }
    
            return (int) result;
        }
    }

    字符串转整数

    package com.sly.uploadfile.algorithm;
    
    /**
     * Created by fmgao on 2019/9/19.
     */
    
    /**
     * 字符串转整数(atoi)
     * <p>
     * 实现 atoi,将字符串转为整数。
     * <p>
     * 在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
     * <p>
     * 字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
     * <p>
     * 当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
     * <p>
     * 若函数不能执行有效的转换,返回 0。
     * <p>
     * 说明:
     * <p>
     * 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。如果数值超过可表示的范围,则返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。
     * <p>
     * 示例 1:
     * <p>
     * 输入: "42"
     * 输出: 42
     * <p>
     * 示例 2:
     * <p>
     * 输入: "   -42"
     * 输出: -42
     * 解释: 第一个非空白字符为 '-', 它是一个负号。
     * 我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
     * <p>
     * 示例 3:
     * <p>
     * 输入: "4193 with words"
     * 输出: 4193
     * 解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
     * <p>
     * 示例 4:
     * <p>
     * 输入: "words and 987"
     * 输出: 0
     * 解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     * 因此无法执行有效的转换。
     * <p>
     * 示例 5:
     * <p>
     * 输入: "-91283472332"
     * 输出: -2147483648
     * 解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
     * 因此返回 INT_MIN (−231) 。
     */
    public class StringToNum {
    
        public static void main(String[] args) {
            int res = myAtoi("      -357dhfjdk");
            System.out.println(res);
        }
    
        public static int myAtoi(String str) {
            int length = str.length();
            int index = 0;
            //先找到第一个非空的index
            while (index < length) {
                if (str.charAt(index) == ' ') {
                    index++;
                } else {
                    break;
                }
            }
            if (index == length) {
                return 0;
            }
            char now = str.charAt(index);
            int num = 0;
            //num要乘以isPositive
            int isPositive = 1;
            //去掉异常情况
            if (now != '+' && now != '-' && (now > '9' || now < '0')) {
                return 0;
            }
            if (now == '+') {
                index++;
            }
            if (now == '-') {
                isPositive = -1;
                index++;
            }
            // -2147483648  2147483647
            int maxValue_10 = Integer.MAX_VALUE / 10;
            int minValue_10 = Integer.MIN_VALUE / 10;
            while (index < length) {
                now = str.charAt(index);
                if (now > '9' || now < '0') {
                    break;
                }
                int nowNum = now - '0';
                if (num > maxValue_10 || (num == maxValue_10 && nowNum > 7)) {
                    num = Integer.MAX_VALUE;
                    break;
                }
                if (num < minValue_10 || (num == minValue_10 && nowNum > 8)) {
                    num = Integer.MIN_VALUE;
                    break;
                }
                num = num * 10 + nowNum * isPositive;
                index++;
            }
            return num;
        }
    }

    无重复字符串最长字串

    package com.sly.uploadfile.algorithm;
    
    import java.util.LinkedList;
    
    /**
     * Created by fmgao on 2019/9/2.
     * 给定一个字符串,找出不含有重复字符的最长子串的长度。
     * <p>
     * 示例:
     * <p>
     * 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
     * <p>
     * 给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
     * <p>
     * 给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列  而不是子串
     */
    public class Wucongfuzifuzuichangzichuan {
        public static void main(String[] args) {
            String s = "12345665432179456789";
            System.out.println(lengthOfLongestSubstring(s));
        }
    
        public static int lengthOfLongestSubstring(String s) {
            int num = 0;
            int current = 0;
            char[] arr = s.toCharArray();
            LinkedList<Character> temp = new LinkedList<>();
            for (int i = 0; i < arr.length; i++) {
                if (!temp.contains(arr[i])) {
                    temp.add(arr[i]);
                    current = temp.size();
                    if (current > num) {
                        num = current;
                    }
                } else {
                    //如果新增字符与原子串中字符有重复的,删除原子串中重复字符及在它之前的字符,与新增字符组成新的子串
                    temp.add(arr[i]);
                    int first = temp.indexOf(arr[i]);
                    for (int j = 0; j < first; j++) {
                        temp.remove();
                    }
                    temp.remove();
                }
            }
            return num;
        }
    }

    最长回文子串

    package com.sly.uploadfile.algorithm;
    
    /**
     * Created by admin on 2020/6/10.
     */
    public class ZuiChangHuiWenZiChuan {
    
        public static void main(String[] args) {
            System.out.println(longestPalindrome("12345665432179456789"));
            System.out.println(longestPalindrome2("12345665432179456789"));
        }
    
        /**
         * 方法一:动态规划
         * 定义P(i,j):如果字符串从i位置到j位置是回文,P(i,j)=true;否则,P(i,j)=false;
         * 那么P(i,j)= P(i+1,j−1) && Si==Sj
         * 首先初始化一字母和二字母的回文:
         * P(i,i)=true P(i, i) = true P(i,i)=true
         * P(i,i+1)=(Si==Si+1)
         * 然后找到所有三字母回文,并依此类推…
         * 复杂度分析
         * 时间复杂度:O(n2)
         * 空间复杂度:O(n2), 该方法使用 O(n2) 的空间来存储表。
         *
         * @param s
         * @return
         */
        public static String longestPalindrome(String s) {
            if (s == null || s.length() <= 1) {
                return s;
            }
            int len = s.length();
            //flag[i][j]=true 表示子串i-j为回文字符串
            boolean[][] flags = new boolean[1000][1000];
            int start = 0;
            int maxlen = 0;
            for (int i = 0; i < len; i++) {
                flags[i][i] = true;
                if (maxlen == 0 || maxlen == 1) {
                    start = i;
                    maxlen = 1;
                }
                //相邻的两个字符相同
                if (i < len - 1 && s.charAt(i) == s.charAt(i + 1)) {
                    flags[i][i + 1] = true;
                    start = i;
                    maxlen = 2;
                }
            }
            //m代表回文子串长度,从3开始
            for (int m = 3; m <= len; m++) {
                for (int i = 0; i <= len - m; i++) {
                    //依次比较是否符合状态转移方程
                    int j = i + m - 1;
                    if (flags[i + 1][j - 1] && s.charAt(i) == s.charAt(j)) {
                        flags[i][j] = true;
                        start = i;
                        maxlen = m;
                    }
                }
            }
            return s.substring(start, start + maxlen);
        }
    
        /**
         * 方法二:中心扩展算法
         * 事实上,只需使用恒定的空间,我们就可以在 O(n2)的时间内解决这个问题。
         * 回文中心的两侧互为镜像。因此,回文可以从它的中心展开
         *
         * @param s
         * @return
         */
        public static String longestPalindrome2(String s) {
            if (s == null || s.length() < 1) {
                return "";
            }
            int start = 0;
            int end = 0;
            for (int i = 0; i < s.length(); i++) {
                int len1 = expandAroundCenter(s, i, i);
                int len2 = expandAroundCenter(s, i, i + 1);
                int len = Math.max(len1, len2);
                if (len > end - start) {
                    start = i - (len - 1) / 2;
                    end = i + len / 2;
                }
            }
            return s.substring(start, end + 1);
        }
    
        private static int expandAroundCenter(String s, int left, int right) {
            int L = left, R = right;
            while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
                L--;
                R++;
            }
            return R - L - 1;
        }
    
    }
    package com.util.companywork;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    /**
     * Created by fmgao on 2019/8/31.
     */
    public class DateThisTest {
        private int x;                  // 日期属性:年
        private int y;                  // 日期属性:月
        private int z;                  // 日期属性:日
        private Calendar localTime;     // 当前日期
    
        public DateThisTest() {
            localTime = Calendar.getInstance();
        }
    
        public static Calendar getCalendarByStr(String s) {
            Calendar calendar = Calendar.getInstance();
            try {
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                Date date = format.parse(s);
                calendar = Calendar.getInstance();
                calendar.setTime(date);
                return calendar;
            } catch (ParseException e) {
                return calendar;
            }
    
        }
    
        /**
         * 功能:得到当前日期 格式为:xxxx-yy-zz (eg: 2007-12-05)<br>
         *
         * @return String
         * @author pure
         */
        public String today() {
            String strY = null;
            String strZ = null;
            x = localTime.get(Calendar.YEAR);
            y = localTime.get(Calendar.MONTH) + 1;
            z = localTime.get(Calendar.DATE);
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            strZ = z >= 10 ? String.valueOf(z) : ("0" + z);
            return x + "-" + strY + "-" + strZ;
        }
    
        public String yestaday() {
            String strY = null;
            String strZ = null;
            x = localTime.get(Calendar.YEAR);
            y = localTime.get(Calendar.MONTH) + 1;
            z = localTime.get(Calendar.DATE) - 1;
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            strZ = z >= 10 ? String.valueOf(z) : ("0" + z);
            return x + "-" + strY + "-" + strZ;
        }
    
        public String yestaday2() {
            Date today = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24);
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    
            return simpleDateFormat.format(today);
        }
    
        public String yestaday2(String s) {
            try {
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                Date today = new Date(simpleDateFormat.parse(s).getTime() - 1000 * 60 * 60 * 24);
                String yesterday = simpleDateFormat.format(today);
                return yesterday;
            } catch (Exception e) {
                return null;
            }
        }
    
        // 上周一
        public String lastWeekMondayPre() {
            String strY = null;
            String strZ = null;
            x = localTime.get(Calendar.YEAR);
            y = localTime.get(Calendar.MONTH) + 1;
            z = localTime.get(Calendar.DATE) - 8;
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            strZ = z >= 10 ? String.valueOf(z) : ("0" + z);
            return x + "-" + strY + "-" + strZ;
        }
    
        /**
         * 功能:得到当前月份月初 格式为:xxxx-yy-zz (eg: 2007-12-01)<br>
         *
         * @return String
         * @author pure
         */
        public String thisMonth() {
            String strY = null;
            x = localTime.get(Calendar.YEAR);
            y = localTime.get(Calendar.MONTH) + 1;
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-01";
        }
    
        public String thisMonth(String s) {
            Calendar rr = getCalendarByStr(s);
            String strY = null;
            x = rr.get(rr.YEAR);
            y = rr.get(rr.MONTH) + 1;
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-01";
        }
    
        public String nextMonth() {
            String strY = null;
            x = localTime.get(Calendar.YEAR);
            y = localTime.get(Calendar.MONTH) + 2;
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-01";
        }
    
        public String nextMonth(String s) {
            Calendar rr = getCalendarByStr(s);
            String strY = null;
            x = rr.get(rr.YEAR);
            y = rr.get(rr.MONTH) + 2;
            if (y > 12) {
                y = y - 12;
                x = x + 1;
            }
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-01";
        }
    
        public String nextMonth2(String s) {
            Calendar rr = getCalendarByStr(s);
            String strY = null;
            x = rr.get(rr.YEAR);
            y = rr.get(rr.MONTH) + 3;
            if (y > 12) {
                y = y - 12;
                x = x + 1;
            }
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-01";
        }
    
        /**
         * 功能:得到当前月份月初 格式为:xxxx-yy-zz (eg: 2007-12-01)<br>
         *
         * @return String
         * @author pure
         */
        public String preMonth() {
            String strY = null;
            x = localTime.get(Calendar.YEAR);
            y = localTime.get(Calendar.MONTH) + 0;
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-01";
        }
    
        /**
         * 功能:得到当前月份前月初 格式为:xxxx-yy-zz (eg: 2007-12-01)<br>
         *
         * @return String
         * @author pure
         */
        public String preMonth(String s) {
            Calendar rr = getCalendarByStr(s);
            String strY = null;
            x = rr.get(rr.YEAR);
            y = rr.get(rr.MONTH);
            if (y < 1) {
                y = 12;
                x = x - 1;
            }
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-01";
        }
    
        public String preMonthEnd() {
            String strY = null;
            String strZ = null;
            boolean leap = false;
            x = localTime.get(Calendar.YEAR);
            y = localTime.get(Calendar.MONTH);
            if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
                strZ = "31";
            }
            if (y == 4 || y == 6 || y == 9 || y == 11) {
                strZ = "30";
            }
            if (y == 2) {
                leap = leapYear(x);
                if (leap) {
                    strZ = "29";
                } else {
                    strZ = "28";
                }
            }
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-" + strZ;
        }
    
        public String preMonthEnd(String s) {
            Calendar rr = getCalendarByStr(s);
            String strY = null;
            String strZ = null;
            boolean leap = false;
            x = rr.get(rr.YEAR);
            y = rr.get(rr.MONTH);
            if (y < 1) {
                y = 12;
                x = x - 1;
            }
            if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
                strZ = "31";
            }
            if (y == 4 || y == 6 || y == 9 || y == 11) {
                strZ = "30";
            }
            if (y == 2) {
                leap = leapYear(x);
                if (leap) {
                    strZ = "29";
                } else {
                    strZ = "28";
                }
            }
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-" + strZ;
        }
    
        /**
         * 功能:得到当前月份月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
         *
         * @return String
         * @author pure
         */
        public String thisMonthEnd() {
            String strY = null;
            String strZ = null;
            boolean leap = false;
            x = localTime.get(Calendar.YEAR);
            y = localTime.get(Calendar.MONTH) + 1;
            if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
                strZ = "31";
            }
            if (y == 4 || y == 6 || y == 9 || y == 11) {
                strZ = "30";
            }
            if (y == 2) {
                leap = leapYear(x);
                if (leap) {
                    strZ = "29";
                } else {
                    strZ = "28";
                }
            }
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-" + strZ;
        }
    
        /**
         * 功能:得到当前月份月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
         *
         * @return String
         * @author pure
         */
        public String thisMonthEnd(String s) {
            Calendar rr = getCalendarByStr(s);
            String strY = null;
            String strZ = null;
            boolean leap = false;
            x = rr.get(rr.YEAR);
            y = rr.get(rr.MONTH) + 1;
            if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
                strZ = "31";
            }
            if (y == 4 || y == 6 || y == 9 || y == 11) {
                strZ = "30";
            }
            if (y == 2) {
                leap = leapYear(x);
                if (leap) {
                    strZ = "29";
                } else {
                    strZ = "28";
                }
            }
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-" + strZ;
        }
    
        /**
         * 功能:得到当前月份下个月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
         *
         * @return String
         * @author pure
         */
        public String thisNextMonthEnd() {
            String strY = null;
            String strZ = null;
            boolean leap = false;
            x = localTime.get(Calendar.YEAR);
            y = localTime.get(Calendar.MONTH) + 2;
            if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
                strZ = "31";
            }
            if (y == 4 || y == 6 || y == 9 || y == 11) {
                strZ = "30";
            }
            if (y == 2) {
                leap = leapYear(x);
                if (leap) {
                    strZ = "29";
                } else {
                    strZ = "28";
                }
            }
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-" + strZ;
        }
    
        /**
         * 功能:得到当前月份下个月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
         *
         * @return String
         * @author pure
         */
        public String thisNextMonthEnd(String s) {
            Calendar rr = getCalendarByStr(s);
            String strY = null;
            String strZ = null;
            boolean leap = false;
            x = rr.get(rr.YEAR);
            y = rr.get(rr.MONTH) + 2;
            if (y > 12) {
                y = y - 12;
                x = x + 1;
            }
            if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
                strZ = "31";
            }
            if (y == 4 || y == 6 || y == 9 || y == 11) {
                strZ = "30";
            }
            if (y == 2) {
                leap = leapYear(x);
                if (leap) {
                    strZ = "29";
                } else {
                    strZ = "28";
                }
            }
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-" + strZ;
        }
    
        /**
         * 功能:得到当前月份三个个月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
         *
         * @return String
         * @author pure
         */
        public String thisThreeMonthEnd(String s) {
            Calendar rr = getCalendarByStr(s);
            String strY = null;
            String strZ = null;
            boolean leap = false;
            x = rr.get(rr.YEAR);
            y = rr.get(rr.MONTH) + 3;
            if (y > 12) {
                y = y - 12;
                x = x + 1;
            }
            if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
                strZ = "31";
            }
            if (y == 4 || y == 6 || y == 9 || y == 11) {
                strZ = "30";
            }
            if (y == 2) {
                leap = leapYear(x);
                if (leap) {
                    strZ = "29";
                } else {
                    strZ = "28";
                }
            }
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-" + strZ;
        }
    
        /**
         * 功能:得到当前月份下个年的月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
         *
         * @return String
         * @author pure
         */
        public String thisNextYearMonthEnd() {
            String strY = null;
            String strZ = null;
            boolean leap = false;
            x = localTime.get(Calendar.YEAR) + 1;
            y = localTime.get(Calendar.MONTH) + 1;
            if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
                strZ = "31";
            }
            if (y == 4 || y == 6 || y == 9 || y == 11) {
                strZ = "30";
            }
            if (y == 2) {
                leap = leapYear(x);
                if (leap) {
                    strZ = "29";
                } else {
                    strZ = "28";
                }
            }
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-" + strZ;
        }
    
        /**
         * 功能:得到当前月份下个年的月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
         *
         * @return String
         * @author pure
         */
        public String thisNextYearMonthEnd(String s) {
            Calendar rr = getCalendarByStr(s);
            String strY = null;
            String strZ = null;
            boolean leap = false;
            x = rr.get(rr.YEAR) + 1;
            y = rr.get(rr.MONTH) + 1;
            if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
                strZ = "31";
            }
            if (y == 4 || y == 6 || y == 9 || y == 11) {
                strZ = "30";
            }
            if (y == 2) {
                leap = leapYear(x);
                if (leap) {
                    strZ = "29";
                } else {
                    strZ = "28";
                }
            }
            strY = y >= 10 ? String.valueOf(y) : ("0" + y);
            return x + "-" + strY + "-" + strZ;
        }
    
        /**
         * 功能:得到当前季度季初 格式为:xxxx-yy-zz (eg: 2007-10-01)<br>
         *
         * @return String
         * @author pure
         */
        public String thisSeason() {
            String dateString = "";
            x = localTime.get(Calendar.YEAR);
            y = localTime.get(Calendar.MONTH) + 1;
            if (y >= 1 && y <= 3) {
                dateString = x + "-" + "01" + "-" + "01";
            }
            if (y >= 4 && y <= 6) {
                dateString = x + "-" + "04" + "-" + "01";
            }
            if (y >= 7 && y <= 9) {
                dateString = x + "-" + "07" + "-" + "01";
            }
            if (y >= 10 && y <= 12) {
                dateString = x + "-" + "10" + "-" + "01";
            }
            return dateString;
        }
    
        /**
         * 功能:得到当前季度季末 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
         *
         * @return String
         * @author pure
         */
        public String thisSeasonEnd() {
            String dateString = "";
            x = localTime.get(Calendar.YEAR);
            y = localTime.get(Calendar.MONTH) + 1;
            if (y >= 1 && y <= 3) {
                dateString = x + "-" + "03" + "-" + "31";
            }
            if (y >= 4 && y <= 6) {
                dateString = x + "-" + "06" + "-" + "30";
            }
            if (y >= 7 && y <= 9) {
                dateString = x + "-" + "09" + "-" + "30";
            }
            if (y >= 10 && y <= 12) {
                dateString = x + "-" + "12" + "-" + "31";
            }
            return dateString;
        }
    
        /**
         * 功能:得到当前季度季末 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
         *
         * @return String
         * @author pure
         */
        public String thisSeasonEnd(String s) {
            Calendar rr = getCalendarByStr(s);
            String dateString = "";
            x = rr.get(rr.YEAR);
            y = rr.get(rr.MONTH) + 1;
            if (y >= 1 && y <= 3) {
                dateString = x + "-" + "03" + "-" + "31";
            }
            if (y >= 4 && y <= 6) {
                dateString = x + "-" + "06" + "-" + "30";
            }
            if (y >= 7 && y <= 9) {
                dateString = x + "-" + "09" + "-" + "30";
            }
            if (y >= 10 && y <= 12) {
                dateString = x + "-" + "12" + "-" + "31";
            }
            return dateString;
        }
    
        /**
         * 功能:得到当前年份年初 格式为:xxxx-yy-zz (eg: 2007-01-01)<br>
         *
         * @return String
         * @author pure
         */
        public String thisYear() {
            x = localTime.get(Calendar.YEAR);
            return x + "-01" + "-01";
        }
    
        public String thisYear(String s) {
            Calendar rr = getCalendarByStr(s);
            x = rr.get(rr.YEAR);
            return x + "-01" + "-01";
        }
    
        public String nextYear() {
            x = localTime.get(Calendar.YEAR) + 1;
            return x + "-01" + "-01";
        }
    
        public String nextYear(String s) {
            Calendar rr = getCalendarByStr(s);
            x = rr.get(rr.YEAR) + 1;
            return x + "-01" + "-01";
        }
    
    
        /**
         * 功能:得到当前年份年底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
         *
         * @return String
         * @author pure
         */
        public String thisYearEnd(String s) {
            Calendar rr = getCalendarByStr(s);
            x = localTime.get(rr.YEAR);
            return x + "-12" + "-31";
        }
    
        /**
         * 功能:得到当前年份年底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
         *
         * @return String
         * @author pure
         */
        public String thisYearEnd() {
            x = localTime.get(Calendar.YEAR);
            return x + "-12" + "-31";
        }
    
        /**
         * 功能:判断输入年份是否为闰年<br>
         *
         * @param year
         * @return 是:true  否:false
         * @author pure
         */
        public boolean leapYear(int year) {
            boolean leap;
            if (year % 4 == 0) {
                if (year % 100 == 0) {
                    if (year % 400 == 0) leap = true;
                    else leap = false;
                } else leap = true;
            } else leap = false;
            return leap;
        }
    
        /**
         * 判断一天是否是周末
         *
         * @param d
         * @return
         */
        public boolean checkWeekendDay(Date d) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(d);
            if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
                return true;
            }
            return false;
        }
    }

    timeUtil

    package com..common.util;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.List;
    
    /**
     * 时间工具类
     */
    public class TimeUtils {
    
        private TimeUtils() {
        }
    
        private static final String YYYY = "yyyy-MM-dd";
        private static final String YYYYHH = "yyyy-MM-dd HH:mm:ss";
    
        /**
         * 取得yyyy-MM-dd HH:mm:ss格式的时间
         *
         * @return
         */
        public static String yyyyMMddHHmmss(Date date) {
            return dateFormat4yyyyMMddHHmmss().format(date);
        }
    
    
        public static Date yyyyMMdd(String formatdate) {
            try {
                return dateFormat4yyyyMMdd().parse(formatdate);
            } catch (Exception e) {
                throw new IllegalStateException(formatdate, e);
            }
        }
    
        public static String yyyyMMdd(Date date) {
            return dateFormat4yyyyMMdd().format(date);
        }
    
        public static String format(DateFormat format, Date date) {
            try {
                return format.format(date);
            } catch (Exception e) {
                throw new IllegalArgumentException(date.toString(), e);
            }
        }
    
    
        /**
         * @return
         */
        public static SimpleDateFormat dateFormat4yyyyMMddHHmmss() {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
    
    
        /**
         * @return yyyy-MM-dd格式
         */
        public static SimpleDateFormat dateFormat4yyyyMMdd() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    
        /**
         * 将字符串格式yyyyMMdd的字符串转为日期,格式"yyyy-MM-dd"
         *
         * @param date 日期字符串
         * @return 返回格式化的日期
         * @throws ParseException 分析时意外地出现了错误异常
         */
        public static String strToDateFormat(String date) {
            try {
                if (StringUtils.isEmpty(date)) {
                    return date;
                }
                SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
                formatter.setLenient(false);
                Date newDate = formatter.parse(date);
                formatter = new SimpleDateFormat("yyyy-MM-dd");
                return formatter.format(newDate);
            } catch (ParseException e) {
                throw new IllegalStateException(date, e);
            }
        }
    
        /**
         * 当前季度的开始时间,即2012-01-1 00:00:00
         *
         * @return
         */
        public static Date getCurrentQuarterStartTime(Date nowDate) throws Exception {
            SimpleDateFormat longSdf = new SimpleDateFormat(YYYYHH);
            SimpleDateFormat shortSdf = new SimpleDateFormat(YYYY);
            Calendar c = Calendar.getInstance();
            c.setTime(nowDate);
            int currentMonth = c.get(Calendar.MONTH) + 1;
            Date now = null;
            if (currentMonth >= 1 && currentMonth <= 3)
                c.set(Calendar.MONTH, 0);
            else if (currentMonth >= 4 && currentMonth <= 6)
                c.set(Calendar.MONTH, 3);
            else if (currentMonth >= 7 && currentMonth <= 9)
                c.set(Calendar.MONTH, 6);
            else if (currentMonth >= 10 && currentMonth <= 12)
                c.set(Calendar.MONTH, 9);
            c.set(Calendar.DATE, 1);
            now = longSdf.parse(shortSdf.format(c.getTime()) + " 00:00:00");
            return now;
        }
    
        /**
         * 当前半年的开始时间,即2012-01-01 00:00:00,2012-06-01 00:00:00
         *
         * @return
         */
        public static Date getCurrentYearStartTime(Date nowDate) throws Exception {
            SimpleDateFormat longSdf = new SimpleDateFormat(YYYYHH);
            SimpleDateFormat shortSdf = new SimpleDateFormat(YYYY);
            Calendar c = Calendar.getInstance();
            c.setTime(nowDate);
            int currentMonth = c.get(Calendar.MONTH) + 1;
            if (currentMonth >= 1 && currentMonth <= 6)
                c.set(Calendar.MONTH, 0);
            else if (currentMonth >= 7 && currentMonth <= 12)
                c.set(Calendar.MONTH, 6);
            c.set(Calendar.DATE, 1);
            Date now = longSdf.parse(shortSdf.format(c.getTime()) + " 00:00:00");
            return now;
        }
    
        /**
         * 当前半年的结束时间,即2012-06-30 23:59:59,2012-12-31 23:59:59
         *
         * @return
         */
        public static Date getCurrentYearEndTime(Date nowDate) throws Exception {
            SimpleDateFormat longSdf = new SimpleDateFormat(YYYYHH);
            SimpleDateFormat shortSdf = new SimpleDateFormat(YYYY);
            Calendar c = Calendar.getInstance();
            c.setTime(nowDate);
            int currentMonth = c.get(Calendar.MONTH) + 1;
            if (currentMonth >= 1 && currentMonth <= 6) {
                c.set(Calendar.MONTH, 5);
                c.set(Calendar.DATE, 30);
            } else if (currentMonth >= 7 && currentMonth <= 12) {
                c.set(Calendar.MONTH, 11);
                c.set(Calendar.DATE, 31);
            }
            Date now = longSdf.parse(shortSdf.format(c.getTime()) + " 23:59:59");
            return now;
        }
    
        /**
         * 当月第一天,即2012-03-31 23:59:59
         *
         * @return
         */
        public static Date getCurrentMonthMiddleday(Date nowDate) {
            // 获取当月第一天和最后一天
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            // 获取前月的第一天
            Calendar cale = Calendar.getInstance();
            cale.setTime(nowDate);
            cale.add(Calendar.MONTH, 0);
            cale.set(Calendar.DAY_OF_MONTH, 15);
            String firstday = format.format(cale.getTime());
            System.out.println("firstday = " + firstday);
            return cale.getTime();
        }
    
    
        /**
         * 当前季度的结束时间,即2012-03-31 23:59:59
         *
         * @return
         */
        public static Date getCurrentQuarterEndTime(Date nowDate) throws Exception {
            SimpleDateFormat longSdf = new SimpleDateFormat(YYYYHH);
            SimpleDateFormat shortSdf = new SimpleDateFormat(YYYY);
            Calendar c = Calendar.getInstance();
            c.setTime(nowDate);
            int currentMonth = c.get(Calendar.MONTH) + 1;
            Date now = null;
            if (currentMonth >= 1 && currentMonth <= 3) {
                c.set(Calendar.MONTH, 2);
                c.set(Calendar.DATE, 31);
            } else if (currentMonth >= 4 && currentMonth <= 6) {
                c.set(Calendar.MONTH, 5);
                c.set(Calendar.DATE, 30);
            } else if (currentMonth >= 7 && currentMonth <= 9) {
                c.set(Calendar.MONTH, 8);
                c.set(Calendar.DATE, 30);
            } else if (currentMonth >= 10 && currentMonth <= 12) {
                c.set(Calendar.MONTH, 11);
                c.set(Calendar.DATE, 31);
            }
            now = longSdf.parse(shortSdf.format(c.getTime()) + " 23:59:59");
            return now;
        }
    
        /**
         * 当年中间的一天,即2019-06-30
         *
         * @return
         */
        public static Date getMiddleDayOfYear(Date nowDate) {
            // 获取前月的第一天
            Calendar cale = Calendar.getInstance();
            cale.setTime(nowDate);
            cale.set(Calendar.MONTH, 5);
            cale.set(Calendar.DAY_OF_MONTH, 30);
            return cale.getTime();
        }
    
        /**
         * 当年尾的一天,即2019-12-31
         *
         * @return
         */
        public static Date getEndDayOfYear(Date nowDate) {
            // 获取前月的第一天
            Calendar cale = Calendar.getInstance();
            cale.setTime(nowDate);
            cale.set(Calendar.MONTH, 11);
            cale.set(Calendar.DAY_OF_MONTH, 31);
            return cale.getTime();
        }
    
        /**
         * 获取制定年月的 日历工作天数
         *
         * @param year
         * @param month
         * @return
         */
        public static List<String> getDates(int year, int month) {
            List<String> dates = new ArrayList<>();
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, year);
            cal.set(Calendar.MONTH, month - 1);
            cal.set(Calendar.DATE, 1);
    
            while (cal.get(Calendar.YEAR) == year &&
                    cal.get(Calendar.MONTH) < month) {
                int day = cal.get(Calendar.DAY_OF_WEEK);
    
                if (!(day == Calendar.SUNDAY || day == Calendar.SATURDAY)) {
                    dates.add(TimeUtils.yyyyMMdd((Date) cal.getTime().clone()));
                }
                cal.add(Calendar.DATE, 1);
            }
            return dates;
    
        }
    
        /**
         * 获取制定年月获取一年的周末
         *
         * @param year
         * @return
         */
        public static List<String> getDatesWeekend(int year) {
            List<String> dates = new ArrayList<>();
            Calendar c = Calendar.getInstance();
            c.set(year, 0, 1);
            Calendar c2 = Calendar.getInstance();
            c2.set(year + 1, 0, 1);
            while (c.compareTo(c2) < 0) {
                if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
                    dates.add(TimeUtils.yyyyMMdd((Date) c.getTime().clone()));
                }
                // 日期+1
                c.add(Calendar.DATE, 1);
            }
            return dates;
        }
    
    }
  • 相关阅读:
    改造二叉树
    汽车加油行驶问题
    [SHOI2012]回家的路
    子串
    P3558 [POI2013]BAJ-Bytecomputer
    HDU
    UVALive
    ZOJ
    HDU
    牛客小白月赛2 题解
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/13169363.html
Copyright © 2011-2022 走看看