double要注意不能用 = 判断相等,最好用 a - b < 0.000001来判断
printf("%.lf", a);
是会四舍五入的!也就是说,printf("%.lf", 0.95);
输出的是1 --Java中的System.out.format也是一样的。
利用System.out.format()
来输出带格式的字符串,和C的printf
比较像,不过可以通过$1来指定对应项。
常用import:import java.util.*;
import java.lang.*;
Scanner要大写,来自import java.util.Scanner;
。
常用:sc.next()
sc.nextInt()
sc.nextLine()
sc.hasNext()
sc.hasNextInt()
sc.hasNextLine()
。
String也要大写,来自import java.lang.String
。
常用:s.charAt()
,s.toCharArray()
。
strchr char * strchr ( const char * str, int character );
相当于Java中的indexOf,只不过返回的是一个char*类型。通过减去首地址指针+1可以得到index。
sprintf 将字符串写入字符串,`sprintf(char*, const char* format, args...);
fgets char * fgets ( char * str, int num, FILE * stream );
从流中读取一整行;
还有一个gets char * gets ( char * str )
直接读取一行(包括空格,会保留读到的换行符);
getchar()
会读取所有字符();scanf("%s", str);
会在空格、Tab和回车处停下,并不读入他们。
int[][] = new int [x][y];
自动初始化为0。boolean会填充为false。
Random ran = new Random(long seed);
ran.nextInt(int limit);
ran.nextDouble()
返回的是0.0-1.0的double。
+
(一元加号)会将较小类型的操作数提升为int(比如byte,short)。
float f = 1e-43f;
(因为编译器会自动识别1e43为double,所以要显式标为float)。
float或double转int时总是截尾,通过Math.round()
即可四舍五入。
容器分为Collection和Map,而Collection分为List和Set。
ArrayList在随机访问时比较快(get()
),但是在队列中间插入和删除比较慢;LinkedList则相反。
ArrayList常用操作:add
, clear
, get
, remove
, set
。
LinkedList通过实现List和Deque(Deque实现了Queue)来实现队列、双向队列甚至栈等容器。LinkedList可以进行的操作非常多,例如add
, get
, offer
, peek
, poll
还有remove
。 以上这些操作都有-First
和-Last
版本分别对应队列第一个和队列最后一个。LinkedList还提供了push
和pop
用于模拟堆栈。
Vector衍生出Stack,Stack的操作大体为peek
, push
和pop
。
要注意List的迭代器有Iterator和ListIterator,ListIterator可以进行previous操作,而Iterator不行。
Set和List比较像,只不过Set中不能存放相同的元素。HashSet采用Hash存放,而TreeSet则是具有排序的存放。
Map存放的是键值对,他也被称为关联数组。Map的遍历可以通过map.entrySet()
、map.keySet()
(返回的是Set)以及map.values()
(返回的是Collection)进行遍历。
对于Queue,不仅有LinkedList,还有一个优先级队列PriorityQueue,通过PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
指定comparator从而指定优先级。
通过String的split
、replaceFirst
和replaceAll
用到正则表达式。当然也可以通过声明Pattern来使用。Pattern pattern = Pattern.compile(String regex);
然后Matcher Matcher m = pattern.matcher(String targetStr);
。matcher.find()
将返回是否找到。我们也可以直接用static boolean Pattern.matches(String regex, CharSequence input)
来匹配。
通过Arrays.asList
和list.toArray
可以在Arrays和List之间互相变换。StringBuilder.append() == String的+=。
通过Arrays.sort(int[])
和Collections.sort(List<T>)
都可以进行排序。Arrays里还有fill和copyOf以及binarySearch。Collections里有reverse()。StringBuilder有reverse函数供调用。
对于多维数组来说,有static boolean deepEquals(Object[] a1, Object[] a2)
、deepToString()
。
对于数组的复制,Arrays有static int[] Arrays.copyOf(int[] ori, int newLength)
, which will automatically truncate or pad the new array with zero.
另一种是static int[] copyOfRange(int[] original, int from, int to)
,包含from但不包含to。这里的from和to都是原数组的。
还有static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
,这是一种比较快的方式。(参考)
Arrays.binarySearch()
只能在已经排好序的数组里使用。Arrays.sort()
有两个重载,一个是:Arrays.sort(Object[] a, int fromIndex, int toIndex)
,另一个是Arrays.sort(T[] a, Comparator<? super T> c)
。后者可以拓展为Arrays.sort(s, Collections.reverseOrder())
,而对于字符串来说,sort()会按照字典序也就是先全部大写字母再小写字母的顺序排序,因此可以通过Arrays.sort(str, String.CASE_INTENSITIVE_ORDER)
来忽略大小写进行排序。
树是递归的。
const char * string.c_str()
返回一个const char *,这里要注意数组内容不可改变,如果要改变还是复制出一个新的数组比较好。通过memcpy(char * newArray, const char * oldArray, size_t arraySize)
就可以复制数组了。
memset(void * dst, int value, size_t size)
vector-->ArrayList in Java, use push_back()
and pop_back()
; queue-->LinkedList in Java, use push()
and pop()
; list-->LinkedList in Java, doubly-linked lists, use push_back()
, push_front()
, pop_back()
and pop_front()
.在pop/pop_back/pop_front之前要访问的话,先front()
/back()
访问完再删除。
void sort(RandomIt first, RandomIt last, Compare comp);
sort