6.6 学习记录

安恒实习

公司项目

信息发布模块

Mysql报this is incompatible with sql_mode=only_full_group_by错误

问题原因

这个错误发生在mysql 5.7 版本及以上版本会出现的问题:

   mysql 5.7版本默认的sql配置是:sql_mode="ONLY_FULL_GROUP_BY",这个配置严格执行了"SQL92标准"。

   很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。
复制代码
问题原理

在sql执行时,出现该原因:

简单来说就是:输出的结果是叫target list,就是select后面跟着的字段,还有一个地方group by column,就是

group by后面跟着的字段。由于开启了ONLY_FULL_GROUP_BY的设置,所以如果一个字段没有在target list

和group by字段中同时出现,或者是聚合函数的值的话,那么这条sql查询是被mysql认为非法的,会报错误。

解决方式

我采用的是临时解决方案,永久解决方案需要修改my.ini里的sql_mode,zip安装的版本没有此文件,需要按网上教程自己创建一个My.ini然后重新创建服务。 临时解决方案:用sql语句临时修改 set @@GLOBAL.sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION; 注:此方法能直接解决问题,但在mysql重启后会无效。

点击对应功能返回500状态码

原因

由于项目调用的接口位于不同模块,该功能调用的接口位于另一个模块,尽管模块已启动,但是查看调用的接口后发现未配置到nginx中,于是根据项目启动的端口重新配置nginx,重启nginx后正常。

拓展学习

遇到的大坑

关于在List<List<>>类型的对象中调用add()方法

public void test() {
List<String>   tem = new ArrayList<>();
List<List<String>> lists = new ArrayList<>();
lists.add(tem); //注意这里如果直接添加tem,后续如果有对tem的操作,同样会修改添加进lists里的tem对象。
}
复制代码

因此应该改为

lists.add(new ArrayList<>(tem));
复制代码

创建新的对象添加进lists中,后续对tem的修改不会影响lists中的对象。

每日一题

338.比特位计数

题目

给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。

示例 1:

输入: 2 输出: [0,1,1] 示例 2:

输入: 5 输出: [0,1,1,2,1,2]

思路

这个类型的题目如果采用转换 -> 遍历的方式时间复杂度是O(n^2),由于是计算1的数量,可以尝试位运算达到一次遍历就解决问题的目的。一个数字n和n-1进行与运算,可以消除掉最右边的'1',而对于n-1,n中1的个数就是n-1中1的个数加一,因此我们只需要求n-1中1的个数。题目也就变成了一个类递归问题。

代码

 public static int[] countBits(int num) {
        int[] res = new int[num+1];
        for(int i = 1; i <= num; i++) {
            res[i] = res[i & i - 1] + 1;
        }
        return res;
    }
复制代码

40组合总和II

题目

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

说明:

所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。 示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8, 所求解集为: [ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]

思路

题目不难,遍历数组进行递归,如果初始值大于target直接返回,

代码

class Solution {
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
    Arrays.sort(candidates);
               List<List<Integer>> lists = new ArrayList<>();
                   List<Integer> tem = new ArrayList<>();
                 util(candidates, target, 0,lists,tem,0);
               return  lists;
    }

    public static void util(int[] candidates, int target, int start,  List<List<Integer>> lists,  List<Integer> tem, int i) {
        for(int j = i; j < candidates.length; j++) {
            start += candidates[j];
            if(start > target) {
                start -= candidates[j];
                break;
            }
            if(start == target) {
                tem.add(candidates[j]);
                if(!lists.contains(tem))
                lists.add(new ArrayList<>(tem));
                start -= candidates[j];
                tem.remove(tem.size() - 1);
                break;
            }
            if(start < target) {
                tem.add(candidates[j]);
                util(candidates, target, start, lists, tem, j+1);
                tem.remove(tem.size() - 1);
                start -= candidates[j];
            }
        }

    }
}
复制代码

转载于:https://juejin.im/post/5cf8697251882539c33e4d6b

猜你喜欢

转载自blog.csdn.net/weixin_33735676/article/details/91459843
6.6
今日推荐