# 58同城的笔试
## 1. 实现出基本的计算器(类似,实现的功能不一样,原题要求是空格就合并,例如(1 5)-->(15))
我就不写了。直接参考大佬的吧,太牛逼了。
## 2. 计算1~n的元素的二进制中1的个数,并返回数组
这个是一个经典的算法了,但无奈本人是渣渣,没有遇到过,但是这种思路一点就破。多读书多看报少吃零食多睡觉。
利用了之前的数据对如今的数据的更新,和f(n) = f(n-1) + f(n-2)的推导类似。
~~~ java
import org.junit.Test; import java.util.Arrays; public class CountOneInNum { /* * 举例 f(5) = f(4) + f(1), 注意2的次方都是一个1,而且是最高位,f(5) = 1 + f(1), f(6) = 1 + f(2)直到f(8) = 1 * */ public int[] countBits(int num) { int[] res = new int[num+1]; int pow2 = 1; int before = 1; for (int i = 1; i <=num; i++) { if (i == pow2) { before = res[i] = 1; pow2 = 1 << pow2;//进制的转换 } else{ res[i] = res[before] + 1;//1就是有2^0; before += 1;//控制住的是数组的前一个的位置的。 } } return res; } @Test public void test() { System.out.println(Arrays.toString(countBits(5))); } ~~~
## 3. 对两个有序数组的共有的元素找出,并返回列表
思路:其实还是很好想到的,对数据的二分法的寻找。
~~~ java
import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; public class Main3 { public ArrayList<Integer> mergerArrays (ArrayList<Integer> arrayA, ArrayList<Integer> arrayB) { // write code here use binary search ArrayList<Integer> res = new ArrayList<>(); int aSize = arrayA.size(); int bSize = arrayB.size(); int index = 0; for (int i = 0; i < aSize; i++) { int tmp = arrayA.get(i); while(index<bSize) { int compare = arrayB.get(index); int right = bSize; int mid = index + (right - index) / 2; if (compare > tmp) { break; } else if(compare == tmp) { res.add(tmp); } else{ if (tmp > arrayB.get(mid)) { index = mid+1; } else if (tmp == arrayB.get(mid)) { res.add(tmp); } else if (tmp < arrayB.get(mid)) { right = mid - 1; } } index++; } } return res; } @Test public void test(){ ArrayList<Integer> arr1 = new ArrayList(Arrays.asList(-5,0,6,8,9,10)); ArrayList<Integer> arr2 = new ArrayList(Arrays.asList(0,8,9,11,15)); System.out.println(mergerArrays(arr1, arr2).toString()); }
~~~