四个算法笔试题(二)

阅读更多
3、列出一个String字符串中的字母的所有组合方式
/**算法设计:
*设置两个变量,一个用于保存需要排列的字符串,即oldString,一个用于保存已经排好的字符串,即outString,每排好一个字符后,就从oldString里将这个字符拿掉,在outString里将这个字符保存起来,然后对oldString中剩下的字符串在进行下一轮循环,这样一直循环,直到oldString为空,一个新的字符串就排列好了;例如:要对“ABC”进行排列,对“ABC”进行循环,先拿出一个“A”放入outString中,outString为“A”,oldString中就剩下“BC”,然后对oldString(现在为“BC”)进行循环,先把“B”放入outString,outString为“AB”,oldString中剩下“C”,再对oldString(现在为“C”)进行循环,将“C”放入outString,outString为“ABC”,oldString为空,将排好的“ABC”放入Set集合,然后退回上次循环,将“C”放入outString,outString为“AC”,oldString为“B”,对oldString进行循环,将“B”放入outString,outString为“ACB”,oldString为空,将排好的“ACB”放入Set集合,然后退回第二层循环,第二层循环的两次循环也结束了,退回第一层循环,将“B”放入outString,outString为“B”,oldString为“AC”,然后对oldString进行如前面所进行的循环,知道第一层循环也结束后,整个排列完成。
*/

public Set  creatStrings(String oldString,String outString){
   Set newStr = new HashSet();
   //判断oldString是否为空
   if(oldString.length()<=0){
       newStr.add(outString);
   }
   //对oldString进行循环
   for(int i=0;i       //递归循环
       Set tempSet = creatString(new StringBuffer(oldString).deleteCharAt(i),outString+oldString.charAt(i));
       newStr.addAll(tempSet);
   }
   return newStr;
}


4、有1到100000共10000个整数,从中任意拿掉2个,将剩下的99998个放入一个数组中,如何快速的找到被拿掉的那两个数,要求时间复杂度为O(n)
/**算法设计:
*这个题没说这数字是否是有序的,如果是有序的就非常好做,对这个数组进行进行遍历,后面的数减去前面的数如果不等于1,则拿掉的数就在这两个数之间
如果这99998个数字是无序的,而且不能对该数组进行排序,那么,先将原来的100000个数字放到一个数组中,再将99998个数字放到一个Set集合中,然后遍历这100000个数字,将其放入Set集合,如果能够放入则表示该数字是被拿掉的,如果不能放入,则表示该数字没有被拿掉
*/

public void findNum(){
   Set numSet = new HashSet();
   for(int i=1;i<100000;i++){
       numSet.add(i);
   }
   int[] numArr = numSet.toArray();
  
   numSet.remove((int)Math.random() * 100000);
   numSet.remove((int)Math.random() * 99999);
 
   for(int i=0;i       boolean f = numSet.add(numArr[i]);
       if(f){
           System.out.println("拿到的数字为:"+numArr[i]);
       }
   }


}

你可能感兴趣的:(找到拿走的数,java)