我有以下简化代码:
#include <stdio.h>
int main ()
{
printf("Hello ");
goto Cleanup;
Cleanup:
char *str = "World\n";
printf("%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)
我收到错误,因为在标签后声明了一个新变量.如果我将标签后的内容(主要是初始化)放在{}块中,则编译成功.
我想在切换的情况下我理解阻塞的原因,但为什么它应该适用于标签?
此错误来自gcc编译器
我正在考虑用软件排序算法,以及可以克服O(nlogn)障碍的可能方法.我不认为在实际意义上可以更快地排序,所以请不要认为我这样做.
话虽如此,似乎几乎所有的排序算法,软件必须知道每个元素的位置.这是有道理的,否则,它如何知道根据某些排序标准放置每个元素的位置?
但是,当我将这个想法与现实世界交叉时,离心机不知道每个分子在按密度分类时的位置.事实上,它并不关心每个分子的位置.然而,由于每个分子都遵循密度和引力定律 - 这让我思考,因此它可以在相对较短的时间内将数万亿个项目分类万亿.
是否有可能在每个节点上有一些开销(某些值或方法加到每个节点上)以"强制"列表的顺序?像离心机这样的东西,只有每个元素都关心它在空间中的相对位置(与其他节点相关).或者,这是否违反了计算中的某些规则?
我认为这里提出的一个重点是自然的量子力学效应以及它们如何同时平行应用于所有粒子.
也许经典计算机固有地限制了对域的排序O(nlogn),其中量子计算机可能能够跨越该阈值并入O(logn)并行的算法.
离心机基本上是平行气泡排序似乎是正确的,其时间复杂度为O(n).
我想下一个想法是,如果大自然可以排序O(n),为什么不能计算机?
我最近遇到过这个,但无法弄清楚为什么语言允许b = c; 低于和失败b = {3,4}.允许后者有问题吗?
struct T {
int x;
int y;
};
int main()
{
T a = {1, 2};
T b;
b = {3, 4}; // why does this fail ?
T c = {3, 4};
b = c; // this works
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我在采访中遇到了这个问题,我无法回答.您必须在数组中找到第一个唯一元素(整数).例如:
3,2,1,4,4,5,6,6,7,3,2,3
Run Code Online (Sandbox Code Playgroud)
然后,独特的元素是1, 5, 7第一个独特的1.
解决方案要求:
O(n)时间复杂度.
O(1)空间复杂性.
我试着说:
使用Hashmaps,Bitvector ......但它们都没有空间复杂度O(1).
谁能告诉我空间O(1)的解决方案?
我试图解决这个问题时遇到了很多麻烦,而麻烦的根源在于创建一个O(n)复杂的算法.这是我正在努力解决的问题:
A长度数组n包含范围内的整数[0, .., n - 1].但是,它只包含n - 1不同的数字.因此,其中一个数字丢失,另一个数字重复.编写一个Java方法,该方法A作为输入参数并返回缺少的数字; 该方法应该运行O(n).例如,何时
A = [0, 2, 1, 2, 4],oddOneOut()应该返回3; 什么时候A = [3, 0, 0, 4, 2, 1],oddOneOut()应该回来5.
显然,这是一个用算法解决的简单问题,(很可能,我只是没有看到它!).我试图用各种方法解决它,但无济于事.我试图用Java解决它,但是如果你更习惯解决它,那也没关系.O(n2)O(n)
先感谢您...
给定一组不同的数字,返回所有可能的排列.
例如,[1,2,3]具有以下排列:
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3] ,1,2],[3,2,1]]
我的迭代解决方案是:
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());
for(int i=0;i<nums.length;i++)
{
List<List<Integer>> temp = new ArrayList<>();
for(List<Integer> a: result)
{
for(int j=0; j<=a.size();j++)
{
a.add(j,nums[i]);
List<Integer> current = new ArrayList<>(a);
temp.add(current);
a.remove(j);
}
}
result = new ArrayList<>(temp);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我的递归解决方案是:
public List<List<Integer>> permuteRec(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (nums == null || nums.length == 0) {
return result;
}
makePermutations(nums, result, 0);
return result;
} …Run Code Online (Sandbox Code Playgroud) 我知道foreach编程的意义以及何时使用它.foreachJava中有关键字吗?我试图找到一个关键字列表,但只有for和没有foreach.
我需要解释一下这条特定的线是如何工作的.
我知道这个函数计算1位的数量,但这条线究竟是如何清除最右边的1位?
int f(int n) {
int c;
for (c = 0; n != 0; ++c)
n = n & (n - 1);
return c;
}
Run Code Online (Sandbox Code Playgroud)
有人可以简单地向我解释一下或给出一些"证明"吗?
我发现了许多快速排序算法的实现,但最后我决定坚持这个:
public static void quickSort(int array[], int start, int end)
{
if(end <= start || start >= end) {
} else {
int pivot = array[start];
int temp = 0 ;
int i = start+1;
for(int j = 1; j <= end; j++) {
if(pivot > array[j]) {
temp = array[j];
array[j] = array[i];
array[i] = temp;
i++;
}
}
array[start] = array[i-1];
array[i-1] = pivot;
quickSort(array, start, i-2);
quickSort(array, i, end);
}}
Run Code Online (Sandbox Code Playgroud)
有几件我很困惑的事情.
为什么有些人建议把第一个元素作为一个支点,其他人告诉你选择中间元素,有些人会告诉你应该选择最后一个元素作为你的支点,它不会有所不同吗?
假设我试图说明为什么如果数组被排序,快速排序将有O(n ^ 2)作为最坏情况的增长顺序.
我有以下数组:
{1,2,3,4,5,6}. …
我有一个计算任何数字的阶乘的程序.当我尝试将其作为100,000这样的大数字时,它会在它达到0之前停止.我猜这是一种防止出现问题的安全机制.
虽然这很好,但它可以防止程序计算大量数字.在我的程序中,变量x达到0后,它会停止递归函数.所以不需要这个"安全网".
这是我的代码供参考:
#include <iostream>
#include <string>
int answer = 1;
int recursive(int x);
using std::cout;
using std::cin;
int main() {
recursive( 100000 );
}
int recursive( int x ) {
cout << x << "\n";
answer = x * answer;
x--;
if ( x > 0 ) {
recursive( x );
}
else {
cout << "Answer: " << answer << "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个障碍?