我的一道面试题目

本文介绍了一种使用10反转置换法实现从m个数中任取n个数的所有可能组合序列的方法。该算法通过初始化特定数组,然后通过不断寻找并反转“10”组合来生成所有组合序列。

面试的人员最后给了我一个题目,我当时傻眼了。他当时问我数学怎么样,我说,“我数学还可以!”。然后他说,要给我一个数学编程的题目做。我说:“会不会很难啊!”。他微笑的说:"很简单!"


题目是这样出的:5个香蕉,4个梨子,3个苹果。如何用程序实现,将这个些水果排列成不同的组合,并用某种语言来实现!

 

 

我找的一些资料:

 

      数学中的组合运算在统计中是十分常见的运算,但用程序输出所有组合的可能性却并不容易。这里介绍一个非常酷的组合算法:(太TM牛逼了)


组合问题:输出从m个数中的任意抽取n个数的组合全部可能序列。

 

[10反转置换法]

 

算法思想:

     (1)  初始化一个m个元素的数组(全部由0,1组成),将前n个初始化为1,后面的为0。这时候就可以输出第一个组合序列了。

     (2)  从前往后找,找到第一个10组合,将其反转成01,然后将这个10组合前面的所有1,全部往左边推 ,即保证其前面的1都在最左边。这时又可以输出一组组合序列了。

     (3)  重复第(2)步,知道找不到10组合位置。这时已经输出了全部的可能序列了。 为什么?你想,(以m=5,n=3为例)一开始是11100,最后就是00111,已经没有10组合了

 

  1. //10置换法源代码   
  2. public void combination(int m,int n)   
  3. {   
  4.     char[] totalArray=new char[m];     
  5.     //记录排序次数   
  6.     int totalSortNum=0;   
  7.            
  8.     //建立 111...100...0   
  9.     for(int i=0;i<m;i++){   
  10.         if(i<n)   
  11.             totalArray[i]='1';   
  12.         else  
  13.             totalArray[i]='0';   
  14.     }   
  15.     totalSortNum+=1;   
  16.        System.out.println(totalSortNum+"\t"+Arrays.toString(totalArray));   
  17.            
  18.     //"10"反转置换法   
  19.     int index=-1;   
  20.     while((index=String.valueOf(totalArray).indexOf("10"))!=-1){   
  21.         //交换"10"为"01"   
  22.         totalArray[index]='0';   
  23.         totalArray[index+1]='1';   
  24.         //计算刚反转的"10"前面所有的'1'全部移动到最左边   
  25.         int count=0;       
  26.         for(int i=0;i<index;i++){   
  27.             if(totalArray[i]=='1')   
  28.                 count++;   
  29.         }   
  30.         for(int j=0;j<index;j++){   
  31.             if(j<count)   
  32.                 totalArray[j]='1';   
  33.             else totalArray[j]='0';   
  34.         }   
  35.         //输出结果   
  36.         totalSortNum++;   
  37.                System.out.println(totalSortNum+"\t"+Arrays.toString(totalArray));   
  38.     }   
  39. }  
### 腾讯实习生面试的技术类型及相关真题 腾讯作为一家领先的科技公司,其实习生面试通常注重考察候选人的基础知识、编程能力以及实际项目的应用能力。以下是常见的技术类型及其对应的真题: #### 1. 数据结构算法 数据结构和算法是腾讯实习生面试中最核心的部分之一。候选人需要熟练掌握常见数据结构(如数组、链表、栈、队列、树等)以及经典算法(如排序、查找、动态规划等)。 例如,在后台开发实习生的一轮面试中曾出现过一道关于回文链表的题目[^4]。 ```java public class Main { public static boolean isPalindrome(ListNode head) { if (head == null || head.next == null) return true; ListNode slow = head, fast = head; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } // 反转后半部分链表 ListNode prev = null, curr = slow; while (curr != null) { ListNode nextTemp = curr.next; curr.next = prev; prev = curr; curr = nextTemp; } // 比较前后两部分 ListNode firstHalf = head, secondHalf = prev; while (secondHalf != null) { if (firstHalf.val != secondHalf.val) return false; firstHalf = firstHalf.next; secondHalf = secondHalf.next; } return true; } } ``` 此代码实现了判断一个单向链表是否为回文的功能。通过快慢指针找到中间节点并反转后半部分链表来实现比较操作。 --- #### 2. 编程基础 除了算法外,基本的编程能力和语法也是考核的重点。例如,编写一段完整的Java程序可能被要求包含类定义、方法声明及调用逻辑。 ```java public class Main { public static void function() { System.out.println("Hello"); } public static void main(String[] args) { function(); System.out.println(" world!"); } } ``` 上述例子展示了如何构建简单的控制台输出应用程序,强调了对面向对象概念的理解以及标准输入/输出流的操作。 --- #### 3. 系统设计项目经验 对于某些岗位而言,系统设计方案或者过往参过的具体工程项目同样会被深入探讨。面试官倾向于询问简历中的具体内容,并期望获得详尽的回答[^3]。因此准备阶段应着重复习自己所列举的各项技能点和技术细节。 --- #### 4. 自我介绍环节 尽管看似简单,但良好的开场白能够给考官留下深刻印象。它仅是展示个人背景的机会,同时也是缓解紧张情绪的有效手段[^2]。 --- ### 总结 综上所述,参加腾讯实习生面试前应当充分准备好以下几个方面:扎实的数据结构算法功底;清晰流畅的语言表达技巧;丰富的实战案例分享;最后别忘了调整好心理状态迎接挑战!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值