Lastest

如何快速学习一门新编程语言2-表达式有哪些可以用,算数运算逻辑运算位运算关系运算赋值其他

如何快速学习一门新编程语言2-表达式有哪些可以用,算数运算逻辑运算位运算关系运算赋值其他 对照java和go的表达式使用方式,用go重写各种运算。 目录 目录 变量如何定义,数据类型有哪些 表达式有哪些可以用,算数运算逻辑运算位运算关系运算赋值其他 逻辑控制结构有哪些,条件判断怎么写,循环如何写,分支语句怎么写 常用数据类型,字符串,数组,哈希表 面向对象1,类怎么写,类数据成员写法,类方法写法,公有/保护/私有权限怎么控制,静态成员和静态方法 面向对象2,如何实现继承,以及继承权限控制 面向对象3,如何实现重载,多态 面向对象4,面向接口编程 异常处理机制 基本数据结构,数组,链表,最小堆,栈,二叉树,图 推广到更多语言 表达式 运算符 按照java划分方式,运算符分为六大类 算数运算符:加,减,乘,除,取模,自增,自减 关系运算: 6种关系运算,等于(==),不等于(!=),大于(>),小于(<),大于等于(>=),小于等于(<=) 位运算:位与,位或,异或,取反,左移位,右移位,按位右移补0(java才有) 逻辑运算: 3种逻辑运算,与(&&)或(||)非(!) 赋值运算 其他运算 我们接下来逐个翻译成go 算数运算符 加减乘除,最基本的四则运算,取模,自增,自减少。几乎所有语言里特性都差不多。需要注意的有两点 是有...

如何快速学习一门新编程语言1-数据类型有哪些,变量如何定义

如何快速学习一门新编程语言1-数据类型有哪些,变量如何定义 我们通过对照java和go的数据类型,变量定义方法,来重写我这辈子背下来的第一段代码a+b求和。 目录 目录 变量如何定义,数据类型有哪些 表达式有哪些可以用,算数运算逻辑运算位运算关系运算赋值其他 逻辑控制结构有哪些,条件判断怎么写,循环如何写,分支语句怎么写 常用数据类型,字符串,数组,哈希表 面向对象1,类怎么写,类数据成员写法,类方法写法,公有/保护/私有权限怎么控制,静态成员和静态方法 面向对象2,如何实现继承,以及继承权限控制 面向对象3,如何实现重载,多态 面向对象4,面向接口编程 异常处理机制 基本数据结构,数组,链表,最小堆,栈,二叉树,图 推广到更多语言 数据类型 java有哪些数据类型 8种基本数据类型,6种数值类型(默认值都是0),字符串类型,布尔类型 byte: 1个字节,范围-128到127 short:2个字节,范围-32768到32767 int:4个字节,范围-2^31到2^31-1 long:8字节,范围-2^63到2^63-1 float:单精度浮点,默认0.0f,格式参考IEEE 754 double:双精度浮点,默认0.0d,格式参考IEEE 754 boolean:布尔变量,取值true|false char:字符变量,2个字节(与c不同,c语言中char是1字节...

如何快速学习一门新编程语言0

决定开一个系列文章,专门讲如何在熟练掌握一门编程语言之后,快速的去学习一门全新的语言。 为什么你会觉得学习一门新语言很费劲,无非三点原因。第一,第一门语言没学好。第二,没有跳出编程语言本身来看编程语言,视角提升一层,就像在三维世界看二维平面,自然会不同。第三,不善使用搜索引擎和官方文档来学习。 我有一套非常好用的办法,分为三个步骤: 忽略语言细节,把尽可能多的信息抽象成语言概念 设定一个目标,在新语言环境下来实现它 使用我们从熟悉的语言中得来的概念,通过搜索引擎,或者看书,找到新语言环境下的实现方案 我这里就以java为例,对照着java的做法来学一遍golang吧。 以java为例(或者php python都有对等的东西),后续文章我们用go语言去实现对等的功能即可。 目录 变量如何定义,数据类型有哪些 表达式有哪些可以用,加减乘除逻辑运算位运算 逻辑控制结构有哪些,条件判断怎么写,循环如何写,分支语句怎么写 常用数据类型,字符串,数组,哈希表 面向对象1,类怎么写,类数据成员写法,类方法写法,公有/保护/私有权限怎么控制,静态成员和静态方法 面向对象2,如何实现继承,以及继承权限控制 面向对象3,如何实现重载,多态 面向对象4,面向接口编程 异常处理机制 基本数据结构,数组,链表,最小堆,栈,二叉树,图 推广到更多语言 如果上述文字表示,你不知道说的是什么?或者不...

左边升序右边降序的数组o1时间内计算不重复元素个数

问题 左边升序右边降序的数组o1时间内计算不重复元素个数 比如:[1,2,3,4,4,5,10,9,5,3,1,0], 返回8 要求:空间复杂度o(1), 时间复杂度o(n) 分析 讲真,从来没思考过o1空间复杂度下,要怎么破解这个问题。今天恰好遇到了,就思考下。太菜了,想了好久 下面讲讲思路吧 既然是有规律的升序降序数组,重复的元素都是连在一起的。那么我们顺序筛一遍就可以知道左半部分有多少重复,右半部分有多少重复。时间复杂度O(n),空间复杂度O(1) 左右两头比对,相等就计数器-1。不相等就看大小,右边大则右边下标-1,否则左边下标-1,继续比对。时间复杂度O(n),空间复杂度O(1) 实现代码 。。。。等我去测试下。。。 蛮高兴,自己测试了下,没啥问题 function process($array){ $len = count($array); $total = $len; $left = 0; $right = count($array)-1; // 空数组返回0 if($len < 2){ return $len; } // 去掉升序部分的重复,去掉降序部分的重复,O(n) // 两头开始检查,如果右边当前元素出现在左边,total-1 $pos = 0;...

合并两个升序数组A和B到数组A

题目 给出两个有序的整数数组A(长度m)和B(长度n) ,请将AB数组合并到数组A中,变成一个有序的数组。 算法思路 合并后数据总长度m+n,最后一个元素的位置为A[m+n-1] 从前(下标0)向后(下标m-1,n-1)合并需要挪动后续元素,复杂度高。因此,我们从后向前合并。 如何合并?初始化当前合并下标lastPos = m+n-1, 当前A数组下标posA = m-1, 当前B数组下标posB = n-1 逐个比大小,A[posA]和B[posB]取较大元素,放入A[lastPos]。取A数组,则posA--; 取B数组则posB--。同时lastPos-- 最后如果B数组有剩余,填入A数组即可 关于4和5,如果想问为什么这样就可以达到目的。注意观察,原始A数组中特定位置的数据,要么保持原位不变,要么会向后移动。因此,我们只需要取最大元素,放入lastPos即可 代码实现 public class Solution { public void merge(int A[], int m, int B[], int n) { int posA = m-1; int posB = n-1; int lastPos = m + n - 1; while(posA >= 0 && p...

整数数组中寻找第K大元素

算法思想 使用最大堆结构,最大堆的顶部总是最大元素。因此我们只需要构建一个最大堆,然后循环取K次堆顶就可以拿到目标元素。 堆是什么,怎么使用堆,这里不做讨论。 算法复杂度分析 构建堆:O(N) 取出K个元素,K常数,算法复杂度O(N) 上代码 import java.util.*; public class Finder { PriorityQueue<Integer> maxHeap; public int findKth(int[] a, int n, int K) { // write code here createHeap(a, n); int val = 0; for(int i=0; i<K; i++){ val = maxHeap.poll(); } return val; } public void createHeap(int[] a, int n){ maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() { @Override ...

反转链表

算法思想 初始条件,头结点不能为null,否则直接返回null 对于第i个节点,我们只要得到第i+1到last节点的逆序链表。假设第i+1到last节点的逆序链表的最后一个元素叫prev,那我们只要把prev.next设置为当前节点,并返回当前节点即可 对于最后一个节点last,last.next是null,我们直接返回last即可 以上三步可以逆序,但我们好像没保存新的头结点(原来的尾节点),第三部保存一下即可 上代码 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { protected ListNode newHead; public ListNode ReverseList(ListNode head) { if(head == null){ return null; } ListNode last = ReverseListRecursive(head); last.next = null; retur...

判断单链表中是否有环

算法核心思想 设置两只小狗,一个速度为1,另一只速度为2。小学相遇问题,很简单对吧。如果有环,第二只狗出发之后会追上第一只狗 退出条件 到达链表尾部 避免空指针 实现代码 public class Solution { public boolean hasCycle(ListNode head) { ListNode dog1 = head; // 狗1 ListNode dog2 = head; // 狗2 // 空指针判断 if(dog1 == null || dog2 == null){ return false; } // 退出条件: 空指针 while(dog1.next != null && dog2.next != null && dog2.next.next != null){ dog1 = dog1.next; dog2 = dog2.next.next; // 相遇,有环 if(dog1 == dog2){ return true; ...

用两个栈来实现队列

用两个栈来实现队列 算法思想 什么是栈,后进先出 什么是队列,先进先出 如果有两个栈,如何模拟队列先进先出?假设有三个元素ABC进入栈1,我们按照队列的要求,pop操作应该弹出A。但此时栈1的数据弹出顺序是CBA。解决方法:需要出栈的时候,先把栈1所有数据逐个pop,并push到栈2。最后从栈2出栈,那么我们就可以得到A了 我们把栈1数据全部弹到栈2,那么要入栈如何破?自然是把栈2数据逐个pop,并push进入栈1。最后在把当前数据push进栈1,就好了不是么 上代码 import java.util.Stack; public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void push(int node) { int val; // stack2 => stacl1 while(!stack2.empty()){ val = stack2.pop(); stack1.push(val); }...

执行时间: 55.797815322876 毫秒