一、
一个整型数组里除了两个数字之外,其他的数字都出现了两次。
请写程序找出这两个只出现一次的数字。
num1,num2分别为长度为1的数组。传出参数
将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(array == null || array.length == 0) {
return;
}
//先得到两个数的异或
int sum = 0;
for(int i = 0; i < array.length; i++) {
sum ^= array[i];
}
/* 两个不同的数必然会在某一位上异或为1
* 将整个数组划分为该位为1和该位为0的两个子数组
* 刚好将两个不同的数分开
*/
int index = 1;
while((sum & index) == 0) {
index <<= 1;
}
for(int i = 0; i < array.length; i++) {
if((array[i] & index) == 0) {
num1[0] ^= array[i];
}else {
num2[0] ^= array[i];
}
}
}
}
二、
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。
但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)
。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。
现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
public class Solution {
//本题的关键的连续的整数序列,可以指定序列起点和序列长度,依次遍历
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
//遍历所有可能的起点
for(int i = 1; i <= sum / 2; i++) {
int tmpSum = 0;
ArrayList<Integer> tmp = new ArrayList<>();
//从每个起点顺着往后加
for(int j = i; j <= sum - tmpSum; j++) {
tmpSum += j;
tmp.add(j);
if(tmpSum == sum) {
res.add(tmp);
break;
}
if(tmpSum > sum) {
break;
}
}
}
return res;
}
}
三、
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使他们的和正好是S
如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> res = new ArrayList<>();
if(array == null || array.length == 0) {
return res;
}
//若两个数和相同,当两个数相同时乘积最大;当两个数相差最大时乘积最小
int left = 0, right = array.length - 1;
while(left < right) {
if(array[left] + array[right] == sum) {
res.add(array[left]);
res.add(array[right]);
return res;
}else if(array[left] + array[right] > sum) {
right--;
}else {
left++;
}
}
return res;
}
}
四、
汇编语言中有一种移位指令叫做循环左移(ROL)
现在有个简单的任务,就是用字符串模拟这个指令的运算结果。
对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。
例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
public class Solution {
public String LeftRotateString(String str,int n) {
if(n > str.length()) {
return "";
}
//用JAVA API比较容易实现
return str.substring(n) + str.substring(0, n);
}
}
五、
某司最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。
同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。
例如,“student. a am I”。后
来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。
Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
public class Solution {
//因为单词顺序是相同的,只需将各个单词从后往前加即可
public String ReverseSentence(String str) {
if(str == null) {
return "";
}
if(str.trim().equals("")) {
return str;
}
String[] strs = str.split(" ");
StringBuffer sb = new StringBuffer();
for(int i = strs.length - 1; i >= 0; i--) {
sb.append(strs[i]+" ");
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
}