- 博客(55)
- 资源 (1)
- 收藏
- 关注
原创 冒泡排序算法代码
private void bubleSort(int[] data) { int size = data.length; while (size >= 2) { boolean exchanged = false; for (int i = 0; i < size - 1; i++) { ...
2019-03-22 16:42:09 262
原创 动态规划钢条切割算法简记
private int dynamicAlgorithm(int n) { int[] cache = new int[n + 1]; for (int i = 1; i <= n; i++) {//钢条规模从1到n int temp = Integer.MIN_VALUE; for (int j = ...
2018-12-07 11:45:28 542
原创 敏捷核心思想、设计模式与过度设计
这儿只谈敏捷开发的核心思想,而不谈其他表现形式比如结对编程,测试驱动等。本文不是谈设计模式,而是谈何时该用设计模式。敏捷开发的核心思想是:只对当前已经发生过>=2次的同类需求变更,去应用抽象,封装,或设计模式来调整当前架构,以使之能够灵活适应下次同类需求变更(即下次的同类变更我们能以最少的成本和时间去完成)。 实例一:商场优惠方式。 这个场景很多人在读设计模式时都见过,
2016-10-29 10:42:05 1238
原创 android删除无用资源。
打开Androidstudio--》点击菜单Analyze-->run inspection by name-->搜索Anused resources--->对搜索结果上右键即可delete.
2016-09-15 15:38:28 376
转载 将构件发布到maven
摘要(本文转自https://my.oschina.net/songxinqiang/blog/313226)同时可参考文章(https://github.com/chrisbanes/gradle-mvn-push)maven的神威,我想用过的人都会说好的,用多了难免就会有将自己写的代码也发布到中央仓库的想法,本文就结合我自己的经历简单介绍一下怎样将构件发布到maven的中央仓库
2016-09-15 11:57:09 347
原创 堆排序算法笔记
1,堆排序算法是树形选择排序的改进,使其空间复杂度降低到O(1),时间复杂度O(nlogn)。思想:通过将输入序列构建成大顶堆。并在插入,删除,修改的过程中重新向上或向下调整成大顶堆。使最大的数据在堆顶。所以在输出过程中每次取出堆顶元素输出就得到输入序列的降序排列。重点是向上和向下调整成大顶堆的算法。2,Java代码基本实现:/** * 树形选择排序的改进:堆排序。 * Creat
2016-08-11 22:34:52 362
原创 android AsyncTask使用介绍。
讲几个关键需要注意的地方:1,每一个AsyncTask对象都会在同一个静态的线程池中执行。2,默认情况下,多个AsyncTask对象在线程池中以队列方式串行执行。也就是说同一时刻线程池只会执行一个任务,完成才会执行下一个。3,要想多个AsyncTask对象并发执行,可以调用AsyncTask的setDefaultExecutor(Executor exec)重新设置一个
2016-03-21 22:14:41 369
转载 Android使用gradle快速生成渠道apk包。
https://github.com/GavinCT/AndroidMultiChannelBuildTool
2016-03-16 14:34:40 561
原创 二叉树的反转,递归实现和非递归实现。
package com.alg;import java.util.Stack;/** * Created by lchli on 2016/3/5. */public class BTreeRevert { public static class Node { public Node left; public Node right;
2016-03-05 19:38:02 2247
转载 Android studio中正确引入so文件的方法
转自http://blog.csdn.net/wulianghuan/article/details/44567001相信很多朋友在使用Android studio开发中,遇到过如何引入第三方so文件的问题,然而第三方官方仅仅给出了ADT环境下的集成方式。Android studio中默认使用的是gradle编译方式,与ADT编辑方式不一样,那么so文件应当如何引入呢?
2015-08-30 22:29:32 553
原创 二分查找算法笔记。
1,针对有序序列的查找算法,时间复杂度logN.2,java代码的递归实现:public static int binarySearch(int[] array, int target, int left, int right) { if (left > right) return -1; int midIndex = (left + right) / 2;
2015-07-28 10:43:36 415
原创 希尔排序算法笔记
1,思想:对序列相同间隔上的元素使用插入排序,同时不断减小间隔直到间隔为1。间隔选取公式,通常为:h=3*h+1(h初始1)。通过增大移动距离,减少移动次数的方式使之比普通插入排序更高效。2,效率:时间复杂度约N的1.5次方。3,Java代码实现:
2015-07-27 12:12:29 401
原创 归并排序算法笔记
1,思想:采用先化整为零,然后合零为整的思想。即先把序列一分为二,再把子序列一分为二,依次下去直到不能再分割即到子序列只有一个元素。最后将分割的子序列使用合并排序。2,效率:空间复杂度加倍;时间复杂度为N*logN,与快速排序,基数排序相同。3,Java代码的递归实现:public class MergeSorter { public static void mergeSo
2015-07-27 11:54:14 434
原创 插入排序算法笔记
1,思想:通过选取子序列最右端的数作为标记,向左比较,把比标记小的数存储在它的后边相邻位置,到头后将标记值存储在当前指针的位置。每完成一次内部循环会产生一个局部有序的子序列。2,时间复杂度为N的平方。比冒泡和选择排序快。3,java实现:package aglogim;public class InsertSorter { public static void insertS
2015-07-26 17:37:20 404
原创 选择排序算法笔记
1,思想:通过比较查找序列中的最小值索引,然后把最小值交换到最左端。同理依次查找每一个子序列。2,选择排序拥有和冒泡排序同样的比较时间即时间复杂度N的平方,但是只需进行约N次交换。所以效率比冒泡排序高。3,java实现:package aglogim;public class SelectSorter { public static void selectSort(int[]
2015-07-26 14:29:43 374
原创 冒泡排序算法笔记
1,思想:1)从数据序列左边开始相邻的两个数据进行比较,两者是逆序则相互交换,然后继续往后比较直到到达末尾,第一轮结束,此时最大的数会在最右端正确位置上。2)如上进行下一轮的比较。直到完成n轮。2,时间复杂度为N的平方。3,java代码实现:package aglogim;public class BubSorter { public stati
2015-07-26 13:56:58 374
原创 快速排序算法笔记
1,思想:快速排序算法通过避免不必要的比较操作来减少时间复杂度。同时不会增加空间复杂度。2,实现方式:1)通过选定一个数据项作为参照轴,从数据两端开始向中间扫描,把比轴小的数据项交换到低端,把比轴大的数据项交换到高端,直到低端指针与高端指针相遇时完成一次分割。此时轴会位于正确的序列位置上。2)然后,对被轴分割的两个子序列使用相同的方式进行递归排序。3,java代码实现:pack
2015-07-25 19:23:28 465
原创 string转换成int的算法
public static int stringToInt(String input) { if (!isValidString(input)) { throw new IllegalArgumentException("input is not a number string!!"); } boolean isNegative = isNegative(input); i
2015-07-23 10:22:51 1593
原创 Android圆形ImageView和圆角矩形ImageView
1,圆形ImageViewpackage com.commonlib.ui;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapShader;import android.gr
2015-07-21 10:30:53 1917
原创 【android安全】保护app本地数据文件
方法步骤:1,将文件放在尽量安全的位置,比如内部存储而不是sd卡。2,对文件内容使用对称加密或基于口令的加密。3,对于数据库可用相关工具加密比如SQLCiper。4,使用android设备管理策略。5,使用加密的SharePreference即Secure-Preferences(免费的,可到github下载)一,使用spongycastle进行对称
2015-07-18 13:24:14 2616
原创 【android安全】之保护app组件
1,android四大组件Activity,Service,BroadcastReceiver,ContentProvider.1)如果组件不允许其他任何app调用的话,可将android:exported="false"2)如果组件仅仅对自己相同签名的app开放的话,可以使用自定义权限并把权限级别声明为android:protectionLevel="signature"3)其他场景
2015-07-18 11:47:08 734
原创 android依赖注入框架Butter Knife的使用。
优点:1,Butter Knife基于编译时生成代码的方式优于其他基于反射的注入框架,因为反射需要运行时注入会影响程序性能。2,Butter Knife使用简单,不需额外的继承规定的父类。组合优于继承。3,支持字段和方法的注入实现。缺点:1,不支持普通java对象POJO的注入。使用方法请参照:http://jakewharton.github.io/butterkni
2015-07-16 15:37:27 554
原创 【android安全】之使用ssl验证保护网络数据传输安全。
SSL pinning 限定受信SSL的范围。一、先介绍一种使用服务器证书pin码验证方式的安全传输,步骤如下:1,获取服务器的证书pin码。2,将pin码复制到android app的代码里面。可写在Const类里面,例如:package com.test;public final class Const { public static f
2015-07-15 23:25:43 2134
转载 Android中attr自定义属性详解
Android中attr自定义属性详解(转至:http://googlers.iteye.com/blog/1122585)博客分类: android xmlns:wen=http://schemas.android.com/apk/res/com.iteye.googlers android:orientation="vertical" an
2015-07-14 11:17:04 622
原创 【android安全】之防止apk被篡改后重编译。
现状:很多apk会被黑客反编译成smali文件,然后修改或植入恶意代码后重新编译成apk发布到市场。解决要点:1,代码混淆。(此法容易被攻破)2,apk运行时进行签名验证和crc校验码验证。(此法的验证代码容易被黑客注销掉,使之不起作用)个人总结的比较安全的解决方式:(这里不考虑网络通信被中间人拦截情况,后面会给出防止网络拦截的ssl验证方法)1)服务器保存发布时apk的加密的
2015-07-14 00:02:21 3795
转载 android 开源组件
1,滚轮选择器,wheelPicker。https://github.com/ai212983/android-spinnerwheel2,支持header的list。https://github.com/emilsjolander/StickyListHeaders3,下拉刷新list.https://github.com/chrisbanes/And
2015-07-10 18:16:30 483
原创 使用桥接模式让两个抽象层级能够独立的演化。
1,A是一个抽象类,它HAS-A抽象类B.A有不同的实现类,B也有不同的实现类。见下面简画的图:使用桥接模式可以让A和B这两个抽象层级独立的变化和扩展而不会相互影响。在客户端调用时采用下面的形式比较灵活,并且功能可插拔:void main(..){B b1=new Bimpl1();B b2=new Bimpl2();//A a=new Aimpl1();a
2015-06-26 11:18:34 455
原创 实用软件开发流程
1,取得需求。2,从需求归纳出用例列表或功能列表。3,采用用例驱动或功能驱动进行代码片段实现(可包含类图的设计)。用例驱动:指让一个使用流程通过(往往包含多个功能)。功能驱动:指让一个独立的具体功能通过。4,tdd测试让每一个用例或功能通过。5,采用设计原则和模式增加系统的灵活性。6,集成测试。7,发布。
2015-06-25 15:44:57 453
原创 android 实现文字自动滚动的走马灯效果。
红色为关键代码。1,textview设置: android:id="@+id/tvAutoScroll" android:layout_width="50dp" android:layout_height="wrap_content" android:text="1222222222
2015-06-23 17:56:14 1498
原创 面向对象就是面向生活,而模式就是解决生活中特定问题的最佳实践。
1,模式源于生活而又服务于生活。2,面向对象编程就是面向生活编程,所以生活中的问题都有一个对应的面向对象结构。3,为什么面向对象能解决大规模的软件设计?因为面向对象是生活中问题的一一映射。生活中出现的问题均可一一映射成对象结构。
2015-06-16 10:46:17 517
原创 android移植ffmpeg的编译
一,ffmpeg编译(版本ffmpeg-HEAD-b2ad33d.tar)1,安装汇编编译器[sudo apt-get install yasm].2,ffmpeg根目录放编译脚本build_android.sh内容如下:(备注:NDK相关路径按自己实际情况修改,若需包含编译x264和mp3的话红色部分用于指定x264和mp3的头文件和库所在目录。)#!/bin/bashN
2015-06-04 10:01:13 863 3
原创 浅谈c++复制构造函数和赋值操作符。
何时调用:1,如果变量没有声明过,那么将会调用复制构造函数。如:A a;A a2=a;//调用复制构造函数将a复制到a2.2,如果变量已经声明过,将会调用赋值操作符。A a;A a2;a2=a;//调用赋值操作符将a的值复制到a2备注:不管是复制构造函数还是赋值操作符,都要注意类成员存在指针的情况。这种情况下,如果采用浅复制那么应该使用引用计数;当然
2015-06-03 14:42:14 401
原创 c++中类型的隐式转换。
在满足下条件时,编译器才会使用隐式转换:1,存在匹配的构造函数。如:class A {public:A(B);};//A a=B;2,存在声明的转换操作符:class B {public:operator A() const;};//A a=B;备注:隐式转换有时可能造成二义性。为了阻止编译器使用隐式转换,
2015-06-03 14:24:18 415
原创 利用迭代器,适配器模式实现统一数据访问接口。
package com.iterator;public interface Iter { int next(); boolean hasNext();}package com.iterator;public class ArrayIter implements Iter { private int[] array; private int index; pu
2015-06-01 11:28:00 516
原创 策略模式实现可拓展可插拔的功能。
package com.main;public interface Calculator { int calculate(int input);}package com.main;public class C1 implements Calculator{ @Override public int calculate(int input) { // TODO Auto
2015-06-01 11:00:27 1478
原创 c语言char数组测试
const size_t len=10;char dest[len];char *src="1234567777777777777777777";char src2[]={'1','2','3'};strncpy(dest,src,len);strncpy(dest,src2,len);//for(size_t i=0;i!=len;++i){dest[i]='a
2015-05-23 19:52:54 588
原创 jni.h
/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * Yo
2015-05-23 10:59:12 499
原创 javah生成jni头文件
1,cd 项目\bin\classes2,执行:javah -jni 完整带包类名备注:类名无需包含.class后缀。
2015-05-22 17:55:19 491
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人