2个面试华为光网测试的有关算法题,没答出来,求解!

时间:2022-08-03 18:54:56
总共考了我4个题,前两个比较easy,后面两个小弟我就不会了,求解。
第一题:
    数小孩的题,相信大家可能在学校的时候都作过,我上学的时候老师也讲过,可就是没好好听,一看见这道题的时候那叫一个后悔啊。
    假设n个小孩围成一圈,每次数第m个小孩,该小孩被踢出来,请问当这帮小王八蛋只剩下一个人的时候是第几个人。(比如m=3,第一次数到第3个,第二次从第4个开始往下数,转圈数)写一个方法来实现。

第二题:
    假设有个int型的数n,实现高低位的互换,比如12345,给换成52341,写一个方法实现n的高低位的互换。(n是几不知道)

谢谢大家拉。

243 个解决方案

#1


而且华为给我面试的那个人还一脸不屑的跟我说,这个程序很简单,4,5行就能实现,就用简单的数学方法(%)求模实现,考了一上午脑袋都晕了,当时没想出来。虽然面试没过,但还是想知道到底我是怎么死在丫手底下的。

#2


第二题
#define N 10
#include<stdio.h>
main()
{
    int n,i=0,j=0,a[N]={0};
    long s=0;
    printf("please input the number:");
    scanf("%ld",&s);
    do{a[i++]=s%10;}
    while((s/=10)!=0);
    j=i-1;
    i=0;
    while(i<=j)s=s*10+a[i++];
    printf("%ld",s);
    getch();
}


#3


不过有些长 

#4


LS的貌似是C++

#5


第二题:
public class Test{   
public static void main (String args[ ]){ 
int n=12345;
String s=new String(String.valueOf(n)); 
char temp=s.charAt(0);
s=s.substring(1,5).concat(String.valueOf(s.charAt(0)));
System.out.println(s); 

}

#6


第一题:
#include <stdio.h>
main()
{
    int i,k,count,n,num[50],*p;
    printf("Input number of person: n=");
    scanf("%d",&n);
    p=num;
    for(i=0;i<n;i++)
    *(p+i)=i+1;
    i=0;
    k=0;
    count=0;
    while(count<n-1)
    {
        if(*(p+i)!=0) k++;
        if(k==3)
        { *(p+i)=0;
        k=0;
        count++;
        }
        i++;
        if(i==n) i=0;
    }
    while(*p==0) p++;
    printf("The last one is NO.%d\n",*p);
    getch();
}

#7


还是很长

#8


真想看一下华为的四五行代码

#9


一个对象,存有两个属性,一个属性是序列号,一个是是否被剔除标记,然后就不要再说了吧!

#10


第一题是约瑟夫环的问题,随便一搜就有。第二题,我随便写一个吧,大家继续讨论:


public class Test
{
public static int intSwapEnd(int n)
{
if (n < 0)
{
return -intSwapEnd(-n);
}

if (n < 10)
{
return n;
}

int m = 1;
while (n > m)
{
m *= 10;
}
m /= 10;

return (n%10)*m + (n%m/10)*10 + n/m;

}


public static void main(String args[]) {
System.out.println(intSwapEnd(0));
System.out.println(intSwapEnd(1));
System.out.println(intSwapEnd(12));
System.out.println(intSwapEnd(123));
System.out.println(intSwapEnd(1234));
System.out.println(intSwapEnd(12345));
System.out.println(intSwapEnd(-67890));
}
}

#11


第二题:
public class Test{   
public static void main (String args[ ]){ 
int n=12345;
String s=new String(String.valueOf(n)); 
System.out.println(new StringBuffer(s).reverse().toString()); 

}

#12


寒一个楼上的,回帖不看贴的典型。

#13


楼上的没看清楚题目。

另外字符串不失为一个好方法,但是开销有点大。

#14


第2题其实只要一个递归就可以了,可以5行的

#15


第二题答案,^_^
public class test0401
{
public static void main(String args[])
    {
int i,j;
int a[]=new int[5];
for(i=0;i<5;i++)
  {
int m=1;
int n=12345;
for(j=4-i;j>0;j--)
{
m=m*10;
}
n=(n/m)%10;
a[i]=n;


    }
   for(i=0;i<5;i++)
   {
    int t;
     t=a[0];
     a[0]=a[4];
     a[4]=t;
     System.out.println(a[i]); 
   }
   
    
    

    }
}

#16


第一题

int fun(int n, int m)
{
    int i, r = 0;
    for (i = 2; i <= n; i++)
        r = (r + m) % i;
    return r+1;
}

#17


第二个:
估计算法部分是行数最少的了吧?!
import java.io.*;
public class Test{
   public static void main(String[] args) throws IOException {
  int x;
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      System.out.print("Please input number: ");
       x = Integer.parseInt(in.readLine());
      
        x =rotate (x);

   System.out.println(x);
 }   
      public static int rotate(int n)
{
if (n < 0)
     return -rotate(-n);
else if (n < 10)
     return n;
 int m = 1;
while (n > m)
   m *= 10;
   m /= 10;
                 return (n%10)*m + (n%m/10)*10 + n/m;
     }
}

#18


嘿嘿,第二题,,用了笨方法,,,
应该还很多改进的地方
#include <iostream>

using namespace std;

int TenN(int);
int ChangeSeq(int);


int main()
{
    cout << ChangeSeq(1022) << endl;
    
    system("pause");
    
    
}



int ChangeSeq(int p)
{
    if( p < 0)
    {
        return -ChangeSeq(-p);
    } 
    
    int temp = p;
    int n = 0;
    int val = 0;
    int tempLast = p%10;
    int tempFirst = 0;
    
    while( (val = p/10) !=0 )
    {
           p = val;
           n++;
    }
      
    tempFirst = p%10;

    temp = temp - tempLast - TenN(n) * tempFirst + TenN(n) * tempLast + tempFirst;
    
    return temp;
    
}


int TenN(int n)
{
    int temp = 1;
    for(int i = 0; i<n; i++)
    {
            temp = temp * 10;
    }
    return temp;
}

#19


哈哈
第二个俺是被要求用递归,算起来真的没几行

#20


转圈数 不是到最后1个都没了????

#21


.....呃 最后1个人 他就不停的报数  然后M  
哈哈哈 我也被T了`~~

呃 好傻的题~~~

#22



看后面两题,那题目确实是简单了,,兄弟这么好机会都没把握住啊~~

1;第一题:环型链表,记住编号,通过每次删除链表中一个,动态下标。

2;第二题;每次N-N%(10en)递归

#23


漏了,,第二题,,递归的时候还要N/10en一次

#24


第二题:
    假设有个int型的数n,实现高低位的互换,比如12345,给换成52341,写一个方法实现n的高低位的互换。(n是几不知道)


这个以前学校时在老谭那本C++的书上老做的~~~

#25


简单写个第一题的解答吧。第二题就不值得写了。
没有注释,相信LZ能看得懂。


   int * children = new int[n];
   int pos = 0, count = 0, numberOfTed = 0;
   while(pos < n)  children[pos++] = 1;         
   AnsiString sequenceOfTed = "被T的顺序:";
   while(numberOfTed < n)                       
   {
      if(++pos >= n)   pos = 0;
      if(children[pos] == 1) count++;
      if(count == m)
      {
         ++numberOfTed;
         children[pos] = count = 0;
         sequenceOfTed += " " + AnsiString(pos + 1);
      }
   }
   ShowMessage(sequenceOfTed);
   delete children;

#26


拱!!

#27


第二题,一般不要用递归。
public static void main(String[] args) {
int n = 123456789;
StringBuffer buf = new StringBuffer("" + n);
System.out.println(buf);
final int length = buf.length();
for (int i = length / 2 - 1; i >= 0; i--) {
char ch = buf.charAt(i);
buf.setCharAt(i, buf.charAt(length - i - 1));
buf.setCharAt(length - i - 1, ch);
}
System.out.println(buf);
}

#28


第二题
#include <stdio.h>
 
int main(void)
{
int i=1,j=0;
printf("\ninput a integer:");
scanf("%d",&i);
while( 0 != i )
{


while(i !=0 )
{
j=j*10+i%10;
i/=10;
}

printf("result:%d",j);
j=0;
printf("\ninput a integer:");
scanf("%d",&i);

}

return 1;
}

#29


先回答第二题:
public static void main(String[] args){
    int s = 123456789;

    String strInt = new String(String.valueOf(s));
    char first = strInt.charAt(0);
    char end = strInt.charAt(strInt.length() - 1);
    int answer = Integer.parseInt(String.valueOf(end) + strInt.substring(1,strInt.length() - 1) + String.valueOf(first));
    System.out.println("*************" + answer + "&&&&&&&&&&&&&&");
}

#30


约瑟夫环么,挺经典的。

#31


UP

#32


好多c++教程里面的例程

#33


说说第二体

用一个栈
先入栈
在出栈
问题解决了!
so easy
#define MAX 10
int main()

     /*怎么获得这个序列,就不说了,直接负值了*/
     int a[MAX]={0,1,2,3,4,5,6,7,8,9}
     for(int i = MAX-1;i>-1;i--)
     {
        cout<<a[i];
      }
      cout<<endl;
      System("pause");

}

#34


看来算法很重要呀,我要加把劲学呀

#35


第二题,只要一句话:
int n = 123456789;
int result = Integer.parseInt(new StringBuffer("" + n).reverse());

result就是你要的值了,仅仅是一句话就OK了!

#36


以前我参加华为的面试,做过第2道题,我觉得用递归方法来做比较简单,可参考如下代码:

#include <stdio.h>

void reverse(int n) {
if (0 == n) {
return ;
} else {
printf("%d", n % 10);
reverse(n / 10);
}
}

int main(int argc, char* argv[])
{
reverse(250600);
return 0;
}

#37


经典

#38


个人觉得像这样的面试题应该是考算法,不是考那些库函数把(像上面提到的字符串函数)?
小弟极菜,弱弱问下

#39


大家看看这段哪里出问题了?我的思路
#include "stdafx.h"
void main()
{
int n=12345;
int *a=&n;
    int i=1;
printf("%d",n);
   while((n/=10)>0){
    *(a+i)=n%10;
printf("%d",*(a+i));
i++;
   }
   int n1=0;
   int m=1;
   for(int j=i;j>=1;j--)
   {
    n1+=(*(a+j))*m;
    m*=10;
   }
   printf("%d",n1);
   scanf("%d",&i);
}

#40


。。。。。。

#41


int f(int n){
int m = 0;
do{
    m*= 10;
    m += n%10;
}while((n/=10)!= 0)
    return m;
}

#42


第一题用循环链表,链表: struct Node{ int No;struct Node *link} 
while(指针不是指的自己)
{
每遍历2次,删除下一个节点;
然后链表不能断,给接上;
}

#43


我觉得以后回答这样的贴子,把算法思想写出来就行,别写具体的程序,你自己清楚,别人看着费劲。写个伪代码,大家看得明白,然后觉得可行,自己下去试就行了~

#44


严重同意楼上的

#45


楼主如果数据结构和算法学的再好一点点再做这样的问题就轻松加愉快了,别灰心继续努力,其实基础还是非常重要的

#46


闲着无聊,我也来BT一下……
第一题java或c#:
static int josephRing(int N, int M){
    int[] a = new int[N];    
    int c = 0;
    for (int n = N; n > 0;n-- ){
        for (int i = 0; i < M; ){
            i += (a[c] ^ 1);
            c = ++c % N;
        }
        a[c = (N + c - 1) % N] = 1;
    }
    return 1 + c;
}
第二题,用Standard ML实现:
fun f(b,0)=b |
    f(b,a)=f(b*10+a mod 10,a div 10);
测试:
f(0,12345);
输出:
it=54321

#47


第二题:(VB代码)
Dim a As String
a = Text1.Text                 '用来记录值

'显示部分
Text1.Text = Right(a, 1) & Mid(a, 2, Len(Trim(a)) - 2) & Left(a, 1)

#48


ziyouzai(*在@多则惑) 好强啊,可以说一下你写这段代码是怎么想的吗?

#49


第二题;我也写了一个:
public class Job {

private static int reverse(int n){
do{
n = n%10;
}while(n > 10);

return n;
}
public static void main(String[] args) {
int n = 123456;
String out = "";

while(n != 0){
int r = reverse(n);
n = (n -r)/10;
out += r;
}

System.out.println(out);
}
}

#50


void convert(int *result, int n){
    if(n>=10)
        convert(result+1, n/10);
    *result = n%10;
}

#1


而且华为给我面试的那个人还一脸不屑的跟我说,这个程序很简单,4,5行就能实现,就用简单的数学方法(%)求模实现,考了一上午脑袋都晕了,当时没想出来。虽然面试没过,但还是想知道到底我是怎么死在丫手底下的。

#2


第二题
#define N 10
#include<stdio.h>
main()
{
    int n,i=0,j=0,a[N]={0};
    long s=0;
    printf("please input the number:");
    scanf("%ld",&s);
    do{a[i++]=s%10;}
    while((s/=10)!=0);
    j=i-1;
    i=0;
    while(i<=j)s=s*10+a[i++];
    printf("%ld",s);
    getch();
}


#3


不过有些长 

#4


LS的貌似是C++

#5


第二题:
public class Test{   
public static void main (String args[ ]){ 
int n=12345;
String s=new String(String.valueOf(n)); 
char temp=s.charAt(0);
s=s.substring(1,5).concat(String.valueOf(s.charAt(0)));
System.out.println(s); 

}

#6


第一题:
#include <stdio.h>
main()
{
    int i,k,count,n,num[50],*p;
    printf("Input number of person: n=");
    scanf("%d",&n);
    p=num;
    for(i=0;i<n;i++)
    *(p+i)=i+1;
    i=0;
    k=0;
    count=0;
    while(count<n-1)
    {
        if(*(p+i)!=0) k++;
        if(k==3)
        { *(p+i)=0;
        k=0;
        count++;
        }
        i++;
        if(i==n) i=0;
    }
    while(*p==0) p++;
    printf("The last one is NO.%d\n",*p);
    getch();
}

#7


还是很长

#8


真想看一下华为的四五行代码

#9


一个对象,存有两个属性,一个属性是序列号,一个是是否被剔除标记,然后就不要再说了吧!

#10


第一题是约瑟夫环的问题,随便一搜就有。第二题,我随便写一个吧,大家继续讨论:


public class Test
{
public static int intSwapEnd(int n)
{
if (n < 0)
{
return -intSwapEnd(-n);
}

if (n < 10)
{
return n;
}

int m = 1;
while (n > m)
{
m *= 10;
}
m /= 10;

return (n%10)*m + (n%m/10)*10 + n/m;

}


public static void main(String args[]) {
System.out.println(intSwapEnd(0));
System.out.println(intSwapEnd(1));
System.out.println(intSwapEnd(12));
System.out.println(intSwapEnd(123));
System.out.println(intSwapEnd(1234));
System.out.println(intSwapEnd(12345));
System.out.println(intSwapEnd(-67890));
}
}

#11


第二题:
public class Test{   
public static void main (String args[ ]){ 
int n=12345;
String s=new String(String.valueOf(n)); 
System.out.println(new StringBuffer(s).reverse().toString()); 

}

#12


寒一个楼上的,回帖不看贴的典型。

#13


楼上的没看清楚题目。

另外字符串不失为一个好方法,但是开销有点大。

#14


第2题其实只要一个递归就可以了,可以5行的

#15


第二题答案,^_^
public class test0401
{
public static void main(String args[])
    {
int i,j;
int a[]=new int[5];
for(i=0;i<5;i++)
  {
int m=1;
int n=12345;
for(j=4-i;j>0;j--)
{
m=m*10;
}
n=(n/m)%10;
a[i]=n;


    }
   for(i=0;i<5;i++)
   {
    int t;
     t=a[0];
     a[0]=a[4];
     a[4]=t;
     System.out.println(a[i]); 
   }
   
    
    

    }
}

#16


第一题

int fun(int n, int m)
{
    int i, r = 0;
    for (i = 2; i <= n; i++)
        r = (r + m) % i;
    return r+1;
}

#17


第二个:
估计算法部分是行数最少的了吧?!
import java.io.*;
public class Test{
   public static void main(String[] args) throws IOException {
  int x;
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      System.out.print("Please input number: ");
       x = Integer.parseInt(in.readLine());
      
        x =rotate (x);

   System.out.println(x);
 }   
      public static int rotate(int n)
{
if (n < 0)
     return -rotate(-n);
else if (n < 10)
     return n;
 int m = 1;
while (n > m)
   m *= 10;
   m /= 10;
                 return (n%10)*m + (n%m/10)*10 + n/m;
     }
}

#18


嘿嘿,第二题,,用了笨方法,,,
应该还很多改进的地方
#include <iostream>

using namespace std;

int TenN(int);
int ChangeSeq(int);


int main()
{
    cout << ChangeSeq(1022) << endl;
    
    system("pause");
    
    
}



int ChangeSeq(int p)
{
    if( p < 0)
    {
        return -ChangeSeq(-p);
    } 
    
    int temp = p;
    int n = 0;
    int val = 0;
    int tempLast = p%10;
    int tempFirst = 0;
    
    while( (val = p/10) !=0 )
    {
           p = val;
           n++;
    }
      
    tempFirst = p%10;

    temp = temp - tempLast - TenN(n) * tempFirst + TenN(n) * tempLast + tempFirst;
    
    return temp;
    
}


int TenN(int n)
{
    int temp = 1;
    for(int i = 0; i<n; i++)
    {
            temp = temp * 10;
    }
    return temp;
}

#19


哈哈
第二个俺是被要求用递归,算起来真的没几行

#20


转圈数 不是到最后1个都没了????

#21


.....呃 最后1个人 他就不停的报数  然后M  
哈哈哈 我也被T了`~~

呃 好傻的题~~~

#22



看后面两题,那题目确实是简单了,,兄弟这么好机会都没把握住啊~~

1;第一题:环型链表,记住编号,通过每次删除链表中一个,动态下标。

2;第二题;每次N-N%(10en)递归

#23


漏了,,第二题,,递归的时候还要N/10en一次

#24


第二题:
    假设有个int型的数n,实现高低位的互换,比如12345,给换成52341,写一个方法实现n的高低位的互换。(n是几不知道)


这个以前学校时在老谭那本C++的书上老做的~~~

#25


简单写个第一题的解答吧。第二题就不值得写了。
没有注释,相信LZ能看得懂。


   int * children = new int[n];
   int pos = 0, count = 0, numberOfTed = 0;
   while(pos < n)  children[pos++] = 1;         
   AnsiString sequenceOfTed = "被T的顺序:";
   while(numberOfTed < n)                       
   {
      if(++pos >= n)   pos = 0;
      if(children[pos] == 1) count++;
      if(count == m)
      {
         ++numberOfTed;
         children[pos] = count = 0;
         sequenceOfTed += " " + AnsiString(pos + 1);
      }
   }
   ShowMessage(sequenceOfTed);
   delete children;

#26


拱!!

#27


第二题,一般不要用递归。
public static void main(String[] args) {
int n = 123456789;
StringBuffer buf = new StringBuffer("" + n);
System.out.println(buf);
final int length = buf.length();
for (int i = length / 2 - 1; i >= 0; i--) {
char ch = buf.charAt(i);
buf.setCharAt(i, buf.charAt(length - i - 1));
buf.setCharAt(length - i - 1, ch);
}
System.out.println(buf);
}

#28


第二题
#include <stdio.h>
 
int main(void)
{
int i=1,j=0;
printf("\ninput a integer:");
scanf("%d",&i);
while( 0 != i )
{


while(i !=0 )
{
j=j*10+i%10;
i/=10;
}

printf("result:%d",j);
j=0;
printf("\ninput a integer:");
scanf("%d",&i);

}

return 1;
}

#29


先回答第二题:
public static void main(String[] args){
    int s = 123456789;

    String strInt = new String(String.valueOf(s));
    char first = strInt.charAt(0);
    char end = strInt.charAt(strInt.length() - 1);
    int answer = Integer.parseInt(String.valueOf(end) + strInt.substring(1,strInt.length() - 1) + String.valueOf(first));
    System.out.println("*************" + answer + "&&&&&&&&&&&&&&");
}

#30


约瑟夫环么,挺经典的。

#31


UP

#32


好多c++教程里面的例程

#33


说说第二体

用一个栈
先入栈
在出栈
问题解决了!
so easy
#define MAX 10
int main()

     /*怎么获得这个序列,就不说了,直接负值了*/
     int a[MAX]={0,1,2,3,4,5,6,7,8,9}
     for(int i = MAX-1;i>-1;i--)
     {
        cout<<a[i];
      }
      cout<<endl;
      System("pause");

}

#34


看来算法很重要呀,我要加把劲学呀

#35


第二题,只要一句话:
int n = 123456789;
int result = Integer.parseInt(new StringBuffer("" + n).reverse());

result就是你要的值了,仅仅是一句话就OK了!

#36


以前我参加华为的面试,做过第2道题,我觉得用递归方法来做比较简单,可参考如下代码:

#include <stdio.h>

void reverse(int n) {
if (0 == n) {
return ;
} else {
printf("%d", n % 10);
reverse(n / 10);
}
}

int main(int argc, char* argv[])
{
reverse(250600);
return 0;
}

#37


经典

#38


个人觉得像这样的面试题应该是考算法,不是考那些库函数把(像上面提到的字符串函数)?
小弟极菜,弱弱问下

#39


大家看看这段哪里出问题了?我的思路
#include "stdafx.h"
void main()
{
int n=12345;
int *a=&n;
    int i=1;
printf("%d",n);
   while((n/=10)>0){
    *(a+i)=n%10;
printf("%d",*(a+i));
i++;
   }
   int n1=0;
   int m=1;
   for(int j=i;j>=1;j--)
   {
    n1+=(*(a+j))*m;
    m*=10;
   }
   printf("%d",n1);
   scanf("%d",&i);
}

#40


。。。。。。

#41


int f(int n){
int m = 0;
do{
    m*= 10;
    m += n%10;
}while((n/=10)!= 0)
    return m;
}

#42


第一题用循环链表,链表: struct Node{ int No;struct Node *link} 
while(指针不是指的自己)
{
每遍历2次,删除下一个节点;
然后链表不能断,给接上;
}

#43


我觉得以后回答这样的贴子,把算法思想写出来就行,别写具体的程序,你自己清楚,别人看着费劲。写个伪代码,大家看得明白,然后觉得可行,自己下去试就行了~

#44


严重同意楼上的

#45


楼主如果数据结构和算法学的再好一点点再做这样的问题就轻松加愉快了,别灰心继续努力,其实基础还是非常重要的

#46


闲着无聊,我也来BT一下……
第一题java或c#:
static int josephRing(int N, int M){
    int[] a = new int[N];    
    int c = 0;
    for (int n = N; n > 0;n-- ){
        for (int i = 0; i < M; ){
            i += (a[c] ^ 1);
            c = ++c % N;
        }
        a[c = (N + c - 1) % N] = 1;
    }
    return 1 + c;
}
第二题,用Standard ML实现:
fun f(b,0)=b |
    f(b,a)=f(b*10+a mod 10,a div 10);
测试:
f(0,12345);
输出:
it=54321

#47


第二题:(VB代码)
Dim a As String
a = Text1.Text                 '用来记录值

'显示部分
Text1.Text = Right(a, 1) & Mid(a, 2, Len(Trim(a)) - 2) & Left(a, 1)

#48


ziyouzai(*在@多则惑) 好强啊,可以说一下你写这段代码是怎么想的吗?

#49


第二题;我也写了一个:
public class Job {

private static int reverse(int n){
do{
n = n%10;
}while(n > 10);

return n;
}
public static void main(String[] args) {
int n = 123456;
String out = "";

while(n != 0){
int r = reverse(n);
n = (n -r)/10;
out += r;
}

System.out.println(out);
}
}

#50


void convert(int *result, int n){
    if(n>=10)
        convert(result+1, n/10);
    *result = n%10;
}