首页 > 编程知识 正文

阿里巴巴校招测试题,阿里春招笔试题

时间:2023-05-04 09:03:11 阅读:207101 作者:27

阿里巴巴10.8号笔试题题目描述算法分析关键步骤最后附上实现代码后记
)

阿里巴巴10.8号笔试题 题目描述 题目描述:给定一组或多组三十二位长度的补码数字,返回每组数字加和后的十进制的数字。 算法分析 算法分析:
首先,数字的补码,有正负之分,正整数的补码就是正码。而唯一需要注意的是负整数的补码是它的反码加一。所以根据补码就要减去一,再将求出反码。 关键步骤


第一,判断正负。取字符串第一位数字判断。


第二,字符串是32位长度,存在大量的冗余,所需要的只是后几位的数字。而确定从何处切下的关键在于:正数从左向右,找到第一个1;负数从右向左,找到第一个0。


第三,处理负数字符串,这里用到了位运算<<1。将原字符串切下后的有效部分,先转为十进制整数并减去一,再将减一后的整数进行位运算,记住最后要取负数。

最后附上实现代码 //import java.util.Scanner;public class Main3 { public static void main(String[] args) { // Scanner sc = new Scanner(System.in); // int t = sc.nextInt();//有几组数组 // String[] strs = new String[2*t]; // for(int i=0;i<2*t;i++){ // strs[i] = sc.next(); // } String[] strs = new String[]{ "11111111111111111111111111010110",// -42 "00000000000000000000000000010100" // 20 }; int[] counts = Count(strs); for(int i = 0;i<counts.length-1;i+=2){ int sum = counts[i]+counts[i+1]; System.out.println(sum); } } public static int[] Count(String[] strs){ int[] res = new int[strs.length]; for(int i=0;i< strs.length;i++){ String str = strs[i]; if (str.charAt(0) != '0'){//负数 int begin = str.indexOf('0'); str = str.substring(begin); int con = convert(str)-1; res[i] = -(con<<1); }else{ // 正数 int begin = str.indexOf('1'); str = str.substring(begin-1); int num = convert(str); res[i] = num; } } return res; } public static int convert(String str){ int res=0; char[] chars = str.toCharArray(); for (int i = 0; i < chars.length; i++) { int num = (chars[i]-'0')* (int)Math.pow(2,chars.length-1-i); res += num; } return res; }} 后记

这道题目的算法关键在于知晓位运算,就可以省下很大的气力。大厂尤其重视算法基础,特别是应届毕业生。最后在2021年秋招基本结束之际,预祝大家拿到心仪的offer。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。