classSolution{//如果是人的话会怎样思考呢,从左往右,到每个位置都数0的个数(需要提前确定一共有多少位)//有几个档次,根据第几位来确定:3是百,4是千,7是百万,10是十亿//每次读取时尽量往高了比,如果刚好符合档次,就只说当前,如果超过档次,比如是7,那么就是几十百万,要把后面的位数也算上//整体的逻辑就是这样//映射表也够大的。。。1-9,然后11-19,然后还有20-90privatestaticMap<Integer,String> map =newHashMap<>(){{put(1,"One ");put(2,"Two ");put(3,"Three ");put(4,"Four ");put(5,"Five ");put(6,"Six ");put(7,"Seven ");put(8,"Eight ");put(9,"Nine ");put(10,"Ten ");put(11,"Eleven ");put(12,"Twelve ");put(13,"Thirteen ");put(14,"Fourteen ");put(15,"Fifteen ");put(16,"Sixteen ");put(17,"Seventeen ");put(18,"Eighteen ");put(19,"Nineteen ");put(20,"Twenty ");put(30,"Thirty ");put(40,"Forty ");put(50,"Fifty ");put(60,"Sixty ");put(70,"Seventy ");put(80,"Eighty ");put(90,"Ninety ");}};privatestaticchar[] ss;publicstaticStringnumberToWords(int num){
ss =String.valueOf(num).toCharArray();int n = ss.length;StringBuilder sb =newStringBuilder();for(int i=0; i<n; i++){if(ss[i]=='0'){//0就跳过if(n==1)return"Zero";continue;}int bit = n - i;//当前多少位if(bit>=10){
sb.append(help(i,bit-9));
sb.append("Billion ");
i += bit -10;}elseif(bit>=7){
sb.append(help(i,bit-6));
sb.append("Million ");
i += bit -7;}else{
sb.append(help(i,bit));break;}}return sb.toString().trim();//最终要处理一下空格}//计算百万以下的部分privatestaticStringhelp(int i,int exceedBit){if(exceedBit<=0)return"";if(ss[i]=='0')returnhelp(i+1,exceedBit-1);StringBuilder sb =newStringBuilder();//以千为档if(exceedBit>=4){
sb.append(help(i,exceedBit-3));
sb.append("Thousand ");
sb.append(help(i+exceedBit-3,3));}elseif(exceedBit>=3){
sb.append(help(i,exceedBit-2));
sb.append("Hundred ");
sb.append(help(i+exceedBit-2,2));}else{//还要区分90还是19int num =Integer.valueOf(newString(ss,i,exceedBit));if(num==0)return"";if(num>=20){
sb.append(map.get(num/10*10));
sb.append(help(i+1,exceedBit-1));}else sb.append(map.get(num));//处理1-19}return sb.toString();}}
10-12 lc29. 两数相除
因为不能用乘法,除法,所以想法就是用2^n来进行减法
每次减去2^n*divisor,然后就能够快速逼近0了。这里的乘法用位运算来代替
而结果就是
2
i
+
2
j
+
.
.
.
2^i + 2^j +...
2i+2j+...
classSolution{//每次减divisor * 2^n, publicintdivide(int dividend,int divisor){if(divisor==0)return0;if(dividend==Integer.MIN_VALUE&&divisor==-1)returnInteger.MAX_VALUE;//处理//确定符号int sign =(dividend>=0&&divisor>=0)||(dividend<0&&divisor<0)?1:-1;int res =0;long t =Math.abs((long)dividend);long d =Math.abs((long)divisor);for(int i=31; i>=0; i--){if((t>>i)>=d){
t -= d<<i;
res +=1<<i;}}return res * sign;}}
classSolution{// 只有一个顶峰呗,最大值不是吗,直接O(n),不仅仅是这样,很明显有规律的//因为输入必为山峰数组,那么一定是从小到大,从大到小//就是一个二分查找就可以解决//有前后进行比较,如果mid>=前,那么l=mid,eles if mid <前,r = mid -1publicintpeakIndexInMountainArray(int[] arr){int l =0, r = arr.length-1;while(l<r){if(r-l==1)return arr[l]>arr[r]?l:r;int mid =(l+r)/2;if(arr[mid]>arr[mid-1]) l = mid;else r = mid -1;}return l;}}