可以说是一道小题吧,不过为了保证数据量较大的情况下还能正常运行就不能产生过大开销,所以还是有一定思考的。
首先是对于额外资源的支出,有两个前提标准:1.不能有额外的数组,2.不能多次循环。
在这样条件的限制下,能用的方法并不多。首先如果遍历统计就很有可能创建出一个差不多和数据库一样大的内存空间,这样就是十分糟糕的情况。
于是有了一个取巧的方式,就是两两消去,利用“水王”有着过半数量的特性。
package dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import com.sun.org.apache.regexp.internal.recompile; public class Dao { String findRyan() { String db_url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8"; String db_user = "root"; String db_password = ""; Connection conn = null; Statement state = null; ResultSet rs = null; ArrayList<String> list = new ArrayList<>(); try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(db_url, db_user, db_password); state = conn.createStatement(); rs = state.executeQuery("select uid,reid from post"); while (rs.next()) { String idList = rs.getString("uid") + "|" + rs.getString("reid"); if (!(idList).equals("")) { for (String id : idList.split("\|")) { list.add(id); } } } ; } catch (Exception e) { e.printStackTrace(); } System.out.println(list); for (int i = 0; i < list.size() - 1; i++) { if (!list.get(i).equals(list.get(i + 1))) { list.set(i, "a"); list.set(i + 1, "a"); i=i+1; } } System.out.println(list); return null; } public static void main(String[] args) { Dao aDao = new Dao(); aDao.findRyan(); } }
程序源代码如上,结果如下
[3, 1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 2, 1, 2, 3, 1, 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 3, 1, 2, 3, 1, 1]
[a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, 1, 1, 1, 1, 1, 1, a, a, a, a, a, a, a, a, 1, 1]
可以看到不重复的被消去了,不过我的情况稍微特殊,除了水王全消去了,但不妨碍观察,如此消去之后,仅剩下水王的id可以重复、甚至只有他能存在,所以,只要检测重复的id和结尾的id就可以找到水王了。