多益网络2014校招的一道笔试题---左旋字符串

定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数,分析算法复杂度

当时答的时候用的方法太渣了,

思路是每次左移一位,移动K次。

12345678→23456781→34567812→45678123

这是我写的实现代码

 1 void LeftMove(char* str,int k,int n)
 2 {
 3     k = k%n;
 4     if (NULL == str||k<1||n<1)
 5     {
 6         return;                     //输出合法性检测
 7     }
 8     while(k--)
 9     {
10         int t = str[0];
11         for(int i=1;i<n;i++)
12         {
13            str[i-1] = str[i];
14         }
15         str[n-1] = t;
16     }
17 }

虽然这个算法可以实现数组的循环右移,但是算法复杂度为O(n^2)

后面在别人博客上看见一种比较简单有效而且复杂度比较好的方法---逆序

假设我要移动“12345678”的3位,我可以将字符串分为123,45678两部分

逆序排列123:321

逆序排列45678:87654

全部逆序32187654:45678123

这样也实现了左旋3位数

这是我实现的代码,已测试正确

 1 char *Reverse(char *first,char *end)             //逆序first指针到end指针之间的字符
 2 {
 3     char *temp =first;
 4     if (first>=end||NULL==first||NULL==end)
 5     {
 6         return temp;
 7     }
 8     while (first<end)
 9     {
10         swap(*first++,*end--);
11     }
12     return temp;
13 }
14 void swap(char&a,char&b)                      
15 {
16     char temp = a;
17            a = b;
18            b = temp;
19 }
20 char* LeftMove(char *str,int len,int n)             //左旋函数
21 {
22     if (NULL==str||n<0)
23     {
24         return str;
25     }
26     n = n%len;
27     Reverse(str,str+n-1);
28     Reverse(str+n,str+len-1);
29     Reverse(str,str+len-1);
30     return str;
31 }

算法复杂度为O(n)

总之还得再继续努力,特别是在数据结构和算法要下工夫,这样下一次笔试就能胸有成竹了!

 

转载于:https://www.cnblogs.com/xijiyuan/p/3715191.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
携程的Java校招笔试题主要考察对Java语言的基础知识和应用能力的掌握。下面我将用300字中文回答一道携程Java校招笔试题。 题目描述:有一个包含N个元素的整型数组,数组中的元素可正可负。编写一个函数,返回数组中所包含元素的最大连续子数组的和。 解题思路:这是一道求最大连续子数组和的经典问题,可以使用动态规划的思想解决。 首先,我们定义两个变量max和currentSum,分别用于保存当前的最大连续子数组和和当前元素的和。初始时,将max和currentSum都设置为数组中的第一个元素。 然后,我们从数组的第二个元素开始遍历。对于每个元素,我们将其与之前的currentSum相加,并与该元素本身进行比较。如果大于当前元素,则更新currentSum为这个和,否则,将currentSum设置为当前元素。 同时,我们还需要将currentSum与max进行比较,如果大于max,则更新max为currentSum。这样,每次遍历的时候都会更新最大连续子数组和。 最后,当遍历完整个数组后,max中保存的就是最大连续子数组的和。将其返回即可。 代码示例: ```java public int maxSubArraySum(int[] nums) { int max = nums[0]; int currentSum = nums[0]; for (int i = 1; i < nums.length; i++) { currentSum = Math.max(currentSum + nums[i], nums[i]); max = Math.max(max, currentSum); } return max; } ``` 这个函数的时间复杂度是O(N),其中N是数组的长度。 通过以上的解题思路和示例代码,我们可以在面试中灵活应用,解决类似的最大连续子数组和的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值