今天特别想叹气一下! 感觉自己会的实在是太少太少了!
今天我们的柱大神,看到我看算法的书,说了一句,你刚刚开始看啊?然后又说了一句算法是有天分的人才能会的!
是啊,刚刚开始看,真后悔大学时候干嘛去了,没有实习没有啥的,就知道那看视频,学api,怪不得原来面试各种被鄙视。
算了! 只能笑笑对着自己说! whatever 我还年轻! 对吧! 只要开始了就不晚!
强强大神一句话点醒了我,工业化的时代,熟练工种的学习,做业务确实不需要什么算法,但是如果选择了另外一条路,算法就是必不可少的!
就算是一个普通程序员的积累也好啊!
努力不一定成功! 但放弃一定失败! 相信自己每天进步着,我会厉害起来的!(希望3年后我再看到自己写的这句话,然后在后面加一句!你是对的!)(就在这个括号里面哦!)
哈哈 言归正传
昨天晚上学习了,书里面的一套逻辑,其实在我看来就是一个关于栈使用的小模型,两个人交替出牌,最后看谁的牌先出完(描述的太简单了),其实就是拉大车,哈哈!
public static void main(String[] args){ long startTime = System.currentTimeMillis(); System.out.println("main 方法开始"); // 初始化 两个人的扑克牌 , 和一个扑克牌桌子 ArrayPoker game1 = new ArrayPoker(); ArrayPoker game2 = new ArrayPoker(); int [] game1Poker = {2,4,1,2,5,6}; int [] game2Poker = {3,1,3,5,6,4}; // int[] game1Poker = {2,3,7}; // int[] game2Poker = {1,4,2}; for (int i = 0; i < game1Poker.length; i++) { game1.pokerArray[i] = game1Poker[i]; game1.tail = game1Poker.length; game2.pokerArray[i] = game2Poker[i]; game2.tail = game2Poker.length; } // 初始化栈队列 StackPoker stackPoker = new StackPoker(); while(game1.head != game1.tail && game2.head != game2.tail){ // 第一个人先开始 palyPoker(stackPoker,game1); printArray(game1,"第一个人"); if(checkWin(game1)){ System.out.println("第一个人获得了胜利!"); break; } // 第二个人再开始 palyPoker(stackPoker,game2); printArray(game2,"第二个人"); if(checkWin(game2)){ System.out.println("第二个人获得了胜利!"); break; } printStack(stackPoker); } System.out.println("main 方法结束 耗时:" + (System.currentTimeMillis() - startTime) +" ms!"); } /** * 两个人进行交互,都是往stackPoker里面进行出牌,然后谁先出完了 谁赢 * @param stackPoker * @param arrayPoker */ public static void palyPoker(StackPoker stackPoker, ArrayPoker arrayPoker){ // 准备第一个要出的牌 int pokerNum = arrayPoker.pokerArray[arrayPoker.head]; int stacknum = -1; // 判断是否在牌面上有重合的牌 for(int i =0;i<stackPoker.stackTop;i++){ if(stackPoker.pokerNum[i] == pokerNum){ stacknum = i; break; } } // 如果有嬴牌 就进行如下的操作 if(stacknum != -1){ arrayPoker.head++; arrayPoker.pokerArray[arrayPoker.tail] = pokerNum; arrayPoker.tail++; // 向后移动 for(;(stackPoker.stackTop-1)>=stacknum;){ stackPoker.stackTop--; arrayPoker.pokerArray[arrayPoker.tail++] = stackPoker.pokerNum[stackPoker.stackTop]; } System.out.println(); // stackPoker.stackTop++; }else{ arrayPoker.head++; stackPoker.pokerNum[stackPoker.stackTop++] = pokerNum; } } /** * 打印当前的牌 * @param arrayPoker */ public static void printArray(ArrayPoker arrayPoker,String name){ System.out.print(name+" 的手牌为 : "); for(int i = arrayPoker.head;i < arrayPoker.tail;i++){ System.out.print(arrayPoker.pokerArray[i]+","); } System.out.println(""); } /** * 打印当前栈 * @param stackPoker */ public static void printStack(StackPoker stackPoker){ System.out.print("当前牌面还剩下 : "); for(int i= stackPoker.stackTop -1;i >= 0;i--){ System.out.print(stackPoker.pokerNum[i]+","); } System.out.println(); } /** * 查看那个获得了胜利 * @param arrayPoker * @return */ public static boolean checkWin(ArrayPoker arrayPoker){ if(arrayPoker.head == arrayPoker.tail) { return true; } return false; }感觉以上的代码里面比较头痛的就是,嬴牌后栈里面的元素进行添加到后面这个操作了,经常是outofindex的Exception 最后发现还是自己的想法不够好,最后使用了那种方式进行比较,比较的时候栈顶元素本来就是一个null,必须到下一个地点后才能进行比较,但是这样呢,又会造成最后一次比较0的时候0--,变成-1最后如上进行解决了!
感觉很潦草啊! 可能因为这个是一个练习,确实感觉自己还没有完全的领会其中的精髓,不过感觉自己的逻辑方面慢慢的在提升了,至少慢慢知道一个方法干一件事情,这要是以前! 呵呵了! 自己都不认得自己写的,更加不敢拿出来献丑了!
今天晚上加班学了学,链表,原来觉得链表确实没有什么啊! 重来在写代码的时候就知道 List<String> strList = new ArrayList<String>(); 当然基本上没有使用过什么链表,不过呢,今天了解到了,链表的好处,就是进行插入的速度非常快啊,如果是一个普通的队列,中间插入一个元素,后需要将中间以后的所有元素向后移动一个位置,这样的话,就是说需要移动n/2-1次,这样的开销,如果是一个超级大的list,可想而知,所以使用了链表元素。开销超级小,不需要进行移动,只需要进行赋值一下就好了。
public static void main(String[] args){ long startTime = System.currentTimeMillis(); System.out.println("main 方法开始"); int[] intArray = {1,3,4,5,6,7,26,44,66,77}; LinkedListStruct linkedListStruct = new LinkedListStruct(); for(int i=0;i<intArray.length;i++){ linkedListStruct.data[i] = intArray[i]; linkedListStruct.right[i] = i+1; linkedListStruct.length++; } printLinkedListArray(linkedListStruct); addNumLinkedListArray(linkedListStruct,6,8); printLinkedListArray(linkedListStruct); System.out.println("main 方法结束 耗时:" + (System.currentTimeMillis() - startTime) +" ms!"); } /** * 按照链表的结构打印出链表 * @param linkedListStruct */ public static void printLinkedListArray(LinkedListStruct linkedListStruct){ int index = 0 ; // 获取坐标,这个index相当于是right数组中的数据,里面是下一个要打印的结果 while(linkedListStruct.data[index] != 0){ // 这个循环条件容易出现死循环 System.out.print(linkedListStruct.data[index] +" , "); index = linkedListStruct.right[index]; } System.out.println(); } /** * 在链表中某个数字前加入一个数 (感觉这个需求很少啊!知道了那个数再加? 额!) * @param linkedListStruct * @param number 比对的数字 * @param addNum 添加的数字 */ public static void addNumLinkedListArray(LinkedListStruct linkedListStruct,int number,int addNum){ for(int i =0;i<linkedListStruct.length;i++){ // 如果找到那个数字后 if(linkedListStruct.data[i] == number){ // 第一步 将添加的数据填入到数组中 linkedListStruct.data[linkedListStruct.length] = addNum; // 第二部将被添加数前面的 right设置成为自己的right linkedListStruct.right[linkedListStruct.length] =linkedListStruct.right[i-1]; // 第三部将被添加数的的下一个right 设置为自己 linkedListStruct.right[i-1] = linkedListStruct.length; // 要把这个添加这个数的前面的right设置为 linkedListStruct.right[linkedListStruct.length -1 ] = linkedListStruct.length + 1; linkedListStruct.length++; break; } } // System.out.println("没有找到对应的数字!"); }代码写的还是比较丑,慢慢提升吧! 中间打印链表的时候,书上写的是index !=0的时候继续,但是我这个默认就是0啊,作者都是从1开始,不管什么,哈哈! 可能他也有它的写法把! 从0开始毕竟要考虑好多!
慢慢的感觉自己的逻辑清楚了,希望可以越来越厉害!加油!
明天步入新的一章喽!