//1.scanner /* Scanner scanner=new Scanner(System.in);//从键盘输入 import java.util.Scanner scanner.nextLine();//读入一个字符串,以换行符结束 scanner.next(); //读入一个字符串,以空格结束 scanner.nextInt();//读入一个字符串,以空格结束 scanner.hasNextInt();//判断下一个输入是否为整数;若为输出true,否则false,常搭配while使用 while (scanner.hasNextInt()){ System.out.println(scanner.nextInt()); //如果想要强制退出循环,Ctrl+D }*/ // 2.int类型的最大值最小值 System.out.println( Integer.MAX_VALUE);//int最大值 2147483647 System.out.println( Integer.MIN_VALUE);//int最小值 -2147483648 //3.数组排序 int []a=new int[]{3,2,1}; Arrays.sort(a); //数组排序 import java.util.Arrays System.out.println( Arrays.toString(a));//打印数组 import java.util.Arrays //数组扩容 int []arr=Arrays.copyOf(a,a.length+6); // a:要拷贝的原数组 a.length+6新数组的长度 返回值为新数组 //4.字符串 String s="abc",ss="abc"; System.out.println( s.compareTo(ss)); //字符串比较 -1 代表 < 0 代表 = 1 代表 > 、 System.out.println( s.equals(ss)); //判断值是否相等 = --true != --false int i=0;//0<=i<s.length() s.charAt(i); //获取字符串中的指定下标字符,返回值为char类型 s.toLowerCase();//转为小写 String[]t=s.split(" ");//以“ ”作为分隔符将s分为多个字符串 s=new String(new char[]{'1','8','3'});//把字符数组转为字符串 System.out.println(s); char c[]=s.toCharArray();//将s转为字符数组 System.out.println(Arrays.toString(c)); System.out.println(Integer.parseInt("123"));//如果有非数字则抛出错误 System.out.println(s.contains("83"));//判断“83”是否在s中存在 s.substring(0,1);//截取[0,1)的字符串 s.substring(0);//截取从0开始到结束的字符串 // s.substring(i,j); //0<=i<s.length(); 0<=j<=s.length //Math常用方法 int math1=0,math2=0; Math.min(math1,math2); //不需要导包 Math.max(math1,math2); Math.pow(1.0,2.0); //pow(a,b)-->a^b
//双指针 //用法一: /* 把a[A,B,B,A,A,A,B,A] 变成 a[A,A,A,A,A,B,B,B]的形式 设置两个指针,一个从数组的左部开始找A类数,一个从数组的右部开始找B类数 当左部为A类,指针继续向后移动,指针不动,看右部,右部为B类,指针向前移动,否则 交换左右指针的值,左指针++,右指针--; 当左指针>=右指针则排序完毕; */ //用法二 /* 把nums[0,1,2,2,1,0,0,1,2] 变成nums[0,0,0,1,1,1,2,2,2]的形式 设置两个指针 l=0, r=nums.length-1 for (int i = 0; i <= r; i++) { // 从头到尾一边扫描 //如果发现当前元素==0;则和nums[l]交换,l++,i++;表示已经把0存在了头部,接下来nums[l]准备接收下一个0; //如果发现当前元素==2;则和nums[r]交换,r--,i++;表示已经把2存在了尾部,接下来nums[r]准备接收下一个2; //当i>r时说明遍历结束(r+1--nums.length-1全为2) //当nums[i]==0&&nums[l]==2时,需要把0放到num[l],2放到nums[r]中,即i与nums[i]与nums[l]交换完,i保持不变 i--,后有for循环对其++ 实现i不变,再与其nums[r]交换 //当nums[i]==0&&i==l时,此时按上面的方法处理会导致l>i 我们原先的思想类似与左右两边两条蛇,中间是我们的数组,i每次++,值为0被左边的蛇吃掉; 为2被右边吃,值为1不变;但l>i意味这i的指向在蛇的肚子里,即不符合我们的条件,处理方法是当i==l时,i++;及避免出现l>i if(nums[i]==0){ int temp=nums[i]; nums[i]=nums[l]; nums[l]=temp; if(i==l){ } else {i--;} l++; } else if(nums[i]==2){ int temp=nums[i]; nums[i]=nums[r]; nums[r--]=temp; i--; } } } //如果nums中不止有0,1,2则考虑先把左右两端先排好,在处理子问题 // */ //用法三 /* 找数组中两数之和等于具体值; 数组:nums[1,7,3,4,5,5,6,8,4,9], target=8; 问题:找nums[i],nums[j]使得之和等与target(每个数字只能使用一次) 方法:1.先将数组排好序 复杂度O(nlog(n)); 2.设置指针l,r分别从头和尾遍历,当l>r时遍历结束 3.当nums[l]+nums[r]>target 说明值需要减小;即r--; 当nums[l]+nums[r]<target 说明值需要增大;即l++; 当nums[l]+nums[r]==target 说明找到了;l++;r--;看是否还有其他满足的值 时间复杂度为O(n) 总的时间复杂度为O(nlog(n))+O(n)=O(nlog(n)); */ //用法四 /* 找单链表的中间值 设first,slow都等于链表的头节点, first每次走两步,slow每次走一步,当first.next==null或这first==null则slow即为中间节点, 数组的中间节点:nums.length/2 */